杰克逊反序列化数组或单个对象

时间:2019-12-10 17:32:42

标签: java json jackson

我正在使用Jackson来反序列化从宁静呼叫到ups api的响应,以获取货运跟踪信息。

在回复中,如果每批货物有多个包裹,我将得到与以下代码段相似的回复

    "Shipment": {
        "InquiryNumber": {
            "Code": "01",
            "Description": "ShipmentIdentificationNumber",
            "Value": "some-value-here"
        },
        "ShipperNumber": "1234",
        "Package": [{
                "TrackingNumber": "12345"
            },
            {
                "TrackingNumber": "67890"
            }
        ]
    }
  }

这很好,我可以使用下面的代码简单地使用Jackson来取消编组:

@JsonDeserialize(builder = Shipment.Builder.class)
@Builder(builderClassName = "Builder")
@Getter
public class Shipment {

  @JsonProperty("ShipperNumber")
  private final String shipperNumber;

  @JsonProperty("Package")
  private final List<Package> packages;

  @JsonPOJOBuilder(withPrefix = "")
  public static class Builder {

  }

}

但是,如果api响应中只有一个package项,那么它不是将其作为具有一个条目的软件包集合返回,而是将其作为单个对象返回,如下所示:

    "Shipment": {
        "InquiryNumber": {
            "Code": "01",
            "Description": "ShipmentIdentificationNumber",
            "Value": "some-value-here"
        },
        "ShipperNumber": "1234",
        "Package": {
            "TrackingNumber": "12345"
        }
    }
  }

这将引发以下错误,因为杰克逊无法(显然)将对象反序列化为列表

  

JSON解析错误:无法从START_OBJECT令牌中反序列化java.util.ArrayList<com.example.Package>的实例;

Jackson是否有一种方法可以根据数据类型(即集合或单个对象)封送数据?

0 个答案:

没有答案