当JsonProperty有时是数组,有时是单个Object时,Jackson会对其进行解析

时间:2016-05-11 13:37:45

标签: java json jackson deserialization jackson-modules

我在发布之前搜索过Stack Overflow,但杰克逊没有解决方案。

这是服务器响应:

{
  "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}
}

所以我在课堂上假设“result"TObject s的数组。现在我该怎么办?正在使用@JsonProperty("result")两个字段,其中一个是数组TObject和一个TObject确定? <
em 如果不是我还能做什么?

1 个答案:

答案 0 :(得分:6)

如果您同时启用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

{"result": []}

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

class Result{
   List result;
}

Documentation link

  

确定强制非数组是否可接受的功能   (在JSON中)值用于Java集合(数组,   java.util.Collection)类型。如果启用,收集反序列化器将   尝试处理非数组值,就好像它们有&#34;隐含&#34;周围   JSON数组。此功能旨在用于   兼容性/互操作性的原因,与包一起工作(如   XML-to-JSON转换器)在那种情况下遗漏了JSON数组   只是数组中的单个元素。默认情况下禁用功能。

演示如何将它用于OP输入jsons和POJO:

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

如果您因某种原因不喜欢mapper版本,可以在课程或字段上方使用@JsonFormat

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

PS。关于此问题的其他SO问题:LINK