复杂的JSON转换为Java Jackson

4

这是我的 JSON,我想将其转换成 JAVA 类。

{
  "RELEASED": [
    {
      "purchaseOrderId": "2000",
      "date": "13/06/2019",
      "purchaseOrderLineId": "1",
      "itemCategory": "KuchItemCate1",
      "isDeliveryDelay": true,
      "isShipmentDelay": false
    }
  ],
  "SHIPPED": [
    {
      "purchaseOrderId": "1000",
      "date": "13/06/2019",
      "purchaseOrderLineId": "0",
      "itemCategory": "KuchItemCate0",
      "isDeliveryDelay": true,
      "isShipmentDelay": false
    },
    {
      "purchaseOrderId": "1000",
      "date": "13/06/2019",
      "purchaseOrderLineId": "2",
      "itemCategory": "KuchItemCate2",
      "isDeliveryDelay": true,
      "isShipmentDelay": false
    }
  ]
} 

Java根类: MTHVendorPerformance

public class MTHVendorPerformance implements Serializable {
    Map<String,List<MTHPOStatusDetails>> stringListMap;

    public Map<String, List<MTHPOStatusDetails>> getStringListMap() {
        return stringListMap;
    }

    public void setStringListMap(Map<String, List<MTHPOStatusDetails>> stringListMap) {
        this.stringListMap = stringListMap;
    }
    /*@JsonProperty("RELEASED")
    private List<MTHPOStatusDetails> released;
    @JsonProperty("SHIPPED")
    private List<MTHPOStatusDetails> shipped;

    public List<MTHPOStatusDetails> getShipped() {
        return shipped;
    }

    public void setShipped(List<MTHPOStatusDetails> shipped) {
        this.shipped = shipped;
    }

    public List<MTHPOStatusDetails> getReleased() {
        return released;
    }

    public void setReleased(List<MTHPOStatusDetails> released) {
        this.released = released;
    }*/
}

Java内部类:MTHPOStatusDetails

public class MTHPOStatusDetails {
    private String purchaseOrderId;
    private String date;
    private String purchaseOrderLineId;
    private String itemCategory;
    private boolean isDeliveryDelay;
    private boolean isShipmentDelay;

    public String getPurchaseOrderId() {
        return purchaseOrderId;
    }

    public void setPurchaseOrderId(String purchaseOrderId) {
        this.purchaseOrderId = purchaseOrderId;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getPurchaseOrderLineId() {
        return purchaseOrderLineId;
    }

    public void setPurchaseOrderLineId(String purchaseOrderLineId) {
        this.purchaseOrderLineId = purchaseOrderLineId;
    }

    public String getItemCategory() {
        return itemCategory;
    }

    public void setItemCategory(String itemCategory) {
        this.itemCategory = itemCategory;
    }

    public boolean isDeliveryDelay() {
        return isDeliveryDelay;
    }

    public void setDeliveryDelay(boolean deliveryDelay) {
        isDeliveryDelay = deliveryDelay;
    }

    public boolean isShipmentDelay() {
        return isShipmentDelay;
    }

    public void setShipmentDelay(boolean shipmentDelay) {
        isShipmentDelay = shipmentDelay;
    }
}

将JSON转换为Java对象的代码

代码片段:::::::::

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
ClassLoader classLoader = getClass().getClassLoader();
JsonObject jsonObject = ConfigReader.getConfigFromClasspath("vendor_performance_mth_data.json");

mthVendorPerformance = mapper.readValue(jsonObject.toString(),MTHVendorPerformance.class);

运行上述代码后,我遇到了以下异常。如果您也遇到了这种问题,请告诉我。
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of com.samsclub.fidal.data.model.vendorperformance.MTHPOStatusDetails out of START_ARRAY token
     at [Source: (String)"{"RELEASED":    

我收到以下错误信息: - ashutosh singh
1
为什么“RELEASED” JSON 属性被注释掉了? - Mena
因为那样我需要在我们的代码中检查每个状态。我想要一些动态的东西。只需忽略那部分。 你能告诉我将下面提到的 JSON 转换的最佳方法是什么吗? - ashutosh singh
1个回答

2

在isDeliveryDelay和isShipmentDelay的getter和setter中缺少获取和设置前缀,应该是getIsDeliveryDelay() setIsDeliveryDelay(...)。我认为你通过DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES进行了阴影处理。

如果您想将其存储在映射中,则需要使用:@JsonAnyGetter和@JsonAnySetter 类似这样:

public static class MTHVendorPerformance {
    private Map<String, List<MTHPOStatusDetails>> fields = new HashMap<>();

    @JsonAnyGetter
    public Map<String, List<MTHPOStatusDetails>> getFields() {
      return fields;
    }

    @JsonAnySetter
    public void setFields(String key, List<MTHPOStatusDetails> value) {
      fields.put(key, value);
    }
  }

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