Jackson反序列化时,当JsonProperty有时是数组,有时是单个对象

15

在发布问题之前,我已经在 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"是一个TObject数组。那我现在该怎么办呢?如果我有一个是TObject数组,另一个是单个的TObject,是否可以使用@JsonProperty("result")两次?

如果不可以,我还能做什么?


1
也许这个可以帮助:DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY https://dev59.com/HmQn5IYBdhLWcg3wNk_t#17004714 或者这个:http://stackoverflow.com/search?q=DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - varren
运行得非常完美!谢谢! - Alireza Mohamadi
@varren,请将其作为答案发布,以便可以正确关闭问题,谢谢。 - Alex Stybaev
1个回答

19
如果你启用了DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,那么{"result": []}{"result": {}}都可以被解析为数组。
class Result{
   List result;
}

文档链接

这个特性决定了是否可以将非数组类型(在JSON中)的值强制转换为与Java集合(数组,java.util.Collection)类型一起使用。如果启用,集合反序列化器将尝试处理非数组值,就好像它们有一个“隐式”的包围JSON数组。此功能旨在用于兼容性/互操作性原因,以便与省略JSON数组的软件包(如XML-to-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)

顺便提一下,关于这个问题还有其他的 Stack Overflow 问题:链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接