簡體   English   中英

Java,如何使用Jackson ObjectMapper反序列化雙嵌套json列表

[英]Java, How can I use Jackson ObjectMapper to deserialize a double nested json list

我正在嘗試使用以下結構反序列化json對象:

{"results":{  
  "Assessments":{  
     "Assessment":[  
        {  
           "assessor":"",
           "buildingName":"Emerald Palace Project",
           "certBody":"",
           ...

頂層是一個名為“結果”的實體,其中包含“評估”,只是“評估”的列表/數組。

我嘗試了多種映射器配置組合,例如:

        ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);

但是,無論我如何進行切換,我始終會得到帶有空評估的Results對象。

這是我使用Lombok的對象類。

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Results {
    private Assessments assessments;
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Assessments {
    private List<Assessment> assessments;
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Assessment {
    private int parentId;
    private String stage;
    private String notes;
    private String rating;
    private String scheme;
}

我覺得我一定錯過了一塊。

任何見識將不勝感激。

只是要清楚一點:您寫道

[…]“評估”只是“評估”的列表/數組。

並且您的POJO反映出……那么您的JSON必須是……

{"results":{  
    "Assessments":{  
        [  
            {  
                "assessor":"",
                "buildingName":"Emerald Palace Project",
                "certBody":"",
                ...

…代替…

{"results":{  
    "Assessments":{  
        "Assessment":[  
            {  
                "assessor":"",
                "buildingName":"Emerald Palace Project",
                "certBody":"",
                ...

請直接在“評估”中關注列表。 另外請注意,您的POJO字段是小寫的,因此必須是JSON鍵。

因此,要將POJO與JSON匹配,您可以使用多種選擇:

  • 將您的JSON鍵更改為小寫和駝峰
  • 使用@JsonProperty("field-name")來匹配您的JSON密鑰

但是在每種情況下,您都必須了解有關評估/評估列表的當前沖突。

因此,由於我必須使用第三方API給我的json,因此無法更改json。

這就是我的工作方式。

首先,我必須將評估對象更改為具有唯一名稱的列表。 “ assessment”而不是“ assessments”,因為這是json響應中的拼寫方式。

@Getter
@Setter
@NoArgsConstructor
static class Assessments {
    private List<Assessment> assessment;
}

此外,我還設置了ObjectMapper來忽略大小寫和未知屬性。 確保使用com.fasterxml.jackson.databind.ObjectMapper。

private static ObjectMapper getJsonMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
    return mapper;
}

但是最大的變化是引入了容器類。

@Getter
@Setter
@NoArgsConstructor
private static class JsonContainer {
    private Results results;
}

該類是必需的,因為它包含頂級json對象“ Results”。

在完成這些更改之后,我將Java對象置於預期的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM