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

Jackson desrialize when JsonProperty is sometimes array and sometimes a single Object

我在发帖前搜索了 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"是一个对象。

这是我的 class 我想反序列化它的内容。当然,我为 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}
}

所以我在 class 中假设“result"TObject 的数组。现在我能做什么?正在使用 @JsonProperty("result") 对于两个字段,一个是 TObject 的数组,一个是单个 TObject OK?

如果不行我还能做什么?

如果您同时启用 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

{"result": []}

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

class Result{
   List result;
}

Documentation link

Feature that determines whether it is acceptable to coerce non-array (in JSON) values to work with Java collection (arrays, java.util.Collection) types. If enabled, collection deserializers will try to handle non-array values as if they had "implicit" surrounding JSON array. This feature is meant to be used for compatibility/interoperability reasons, to work with packages (such as XML-to-JSON converters) that leave out JSON array in cases where there is just a single element in array. Feature is disabled by default.

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

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

可以与 class 以上的 @JsonFormat 一起使用,如果您出于某种原因不喜欢映射器版本,则可以与字段一起使用

@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)

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