【问题标题】:Jackson desrialize when JsonProperty is sometimes array and sometimes a single Object当 JsonProperty 有时是数组,有时是单个对象时杰克逊反序列化
【发布时间】:2016-05-11 13:37:44
【问题描述】:

我在发帖前搜索了 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}
}

所以我在课堂上假设“result"TObjects 的数组。现在我该怎么办?@JsonProperty("result") 用于两个字段,其中一个是TObjects 的数组一个是单身TObject 好吗?

如果没有,我还能做什么?

【问题讨论】:

标签: java json jackson deserialization jackson-modules


【解决方案1】:

如果你同时启用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

{"result": []}

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

class Result{
   List result;
}

Documentation link

判断是否可以接受强制非数组的功能 (在 JSON 中)值与 Java 集合(数组, java.util.Collection) 类型。如果启用,集合反序列化器将 尝试处理非数组值,就好像它们有“隐式”包围一样 JSON 数组。此功能旨在用于 兼容性/互操作性原因,使用包(例如 XML-to-JSON 转换器)在有的情况下会省略 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 问题:LINK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2018-03-16
    • 1970-01-01
    • 2011-07-10
    • 2018-12-18
    • 2017-11-16
    相关资源
    最近更新 更多