首页 > 解决方案 > 使用杰克逊反序列化可以是对象列表或对象的属性

问题描述

我的库正在调用一个 API,该 API 可以返回以下任一 JSON 结构 -

{
  "key_is_same" : {
     "inner" : "val"
  } 
}

-或者-

 {
  "key_is_same" : [{
     "inner" : "val1"
    },
    {
     "inner" : "val2"
    }
  ]
}

Jakson 中是否有任何注释可以处理此问题并将其反序列化为相应的类型

标签: javajacksonjson-deserialization

解决方案


看起来您正在寻找ACCEPT_SINGLE_VALUE_AS_ARRAY反序列化功能。

确定是否可以接受强制非数组(在 JSON 中)值以使用 Java 集合(数组,java.util.Collection)类型的功能。如果启用,集合反序列化器将尝试处理非数组值,就好像它们具有“隐式”围绕 JSON 数组一样。此功能旨在用于兼容性/互操作性的原因,与在数组中只有一个元素的情况下省略 JSON 数组的包(例如 XML 到 JSON 转换器)一起使用。

默认情况下禁用该功能。

它可以在以下任一方式启用ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

或通过@JsonFormat注释:

@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<Foo> oneOrMany;

出于说明目的,请考虑以下 JSON 文档:

{
  "oneOrMany": [
    {
      "value": "one"
    },
    {
      "value": "two"
    }
  ]
}
{
  "oneOrMany": {
    "value": "one"
  }
}

它可以反序列化为以下类:

@Data
public class Foo {
    private List<Bar> oneOrMany;
}
@Data
public class Bar {
    private String value;
}

ObjectMapper只需确保在您或您的字段中启用了该功能即可使用@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY).


如果您正在寻找序列化的等效功能,请参阅WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED.


推荐阅读