Jackson 在 JsonProperty 有时是数组,有时是单个对象时进行 Desrialization

在发布之前,我已经搜索了Stack Overflow,但是Jackson没有解决方案。

下面是服务器响应:

{
  "ok": true,
  "result": [
    {
      "update_id": 489881731,
      //rest 
    },
    {
      "update_id": 489881732,
      //rest
    }
  ]
}

如您所见,属性是一个数组。

现在这是另一个响应:"result"

{
  "ok": true,
  "result": {
    "id": 211948704,
    "first_name": "ربات ادمین‌های تلگرام",
    "username": "tgAdminsBot"
  }
}

下面是一个对象。

这是我的类,我想将内容反序列化为它。我当然写了一个自定义的反序列化器"result"TObject

public class Result
{
    private TObject[] result;
    private boolean ok;

    public void setOk (boolean ok) {//code}

    public void setResult (TObject[] result) {//code}


    public TObject[] getResult () {//code}

    public boolean getOk (){//code}
}

所以我在课堂上假设“是s的数组。现在我该怎么办?对两个字段使用@JsonProperty(“result”)是不是,其中一个是目标的数组,另一个是单个对象的数组,可以吗?

如果不是,我还能做些什么?result"TObject


答案 1

如果同时启用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

{"result": []}

{"result": {}}可以解析为

class Result{
   List result;
}

文档链接

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

演示如何将其用于 OP 输入 json 和 POJO:

ObjectMapper mapper = new ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
Result result = mapper.readValue(Result.class;

可以与上述类或字段一起使用,如果您由于某种原因不喜欢映射器版本@JsonFormat

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

PS. 关于此问题的其他 SO 问题: 链接


答案 2