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

Ali*_*adi 9 java json jackson deserialization jackson-modules

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

这是服务器响应:

{
  "ok": true,
  "result": [
    {
      "update_id": 489881731,
      //rest 
    },
    {
      "update_id": 489881732,
      //rest
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如您所见,属性"result"是一个数组.

现在这是另一个回应:

{
  "ok": true,
  "result": {
    "id": 211948704,
    "first_name": "???? ????????? ??????",
    "username": "tgAdminsBot"
  }
}
Run Code Online (Sandbox Code Playgroud)

"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}
}
Run Code Online (Sandbox Code Playgroud)

所以,我认为在我的课是" result"是的数组TObject秒.现在我该怎么办?是使用@JsonProperty("result")两个字段的其中之一是数组TObjectS和一个是单TObject可以吗?

如果不是我还能做什么?

var*_*ren 9

如果DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY同时启用两者

{"result": []}

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

class Result{
   List result;
}
Run Code Online (Sandbox Code Playgroud)

文档链接

确定是否可以强制使用非数组(在JSON中)值以使用Java集合(数组,java.util.Collection)类型的功能.如果启用,集合反序列化器将尝试处理非数组值,就像它们具有围绕JSON数组的"隐式"一样.此功能旨在用于兼容性/互操作性原因,以便在数据库中只有一个元素的情况下使用会丢弃JSON数组的包(例如XML-to-JSON转换器).默认情况下禁用功能.

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

ObjectMapper mapper = new ObjectMapper()
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
Result result = mapper.readValue(Result.class;
Run Code Online (Sandbox Code Playgroud)

@JsonFormat如果您因某些原因不喜欢mapper版本,可以使用上面的类或字段

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
Run Code Online (Sandbox Code Playgroud)

PS.关于这个问题的其他SO问题:LINK