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

时间:2018-03-27 19:14:55

标签: java json jackson objectmapper

我正在尝试使用以下结构反序列化json对象:

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

顶级是名为“results”的单个实体,其中包含“评估”,它们只是“评估”的列表/数组。

我尝试了多种映射器配置组合,例如:

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

但无论我如何切换它,我都会一直使用null Assessments获得一个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;
}

我觉得我必须错过一块。

非常感谢任何见解。

2 个答案:

答案 0 :(得分:2)

要明确:你写了那个

  

[...]&#34;评估&#34;这只是&#34;评估的列表/数组。&#34;

并且您的POJO反映了...那么您的JSON必须是......

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

......而不是......

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

直接在&#34;评估&#34;中注意列表。 还要注意,您的POJO字段是小写的,因此必须是您的JSON密钥。

因此,要将POJO与JSON匹配,您有多种选择:

  • 将您的JSON密钥更改为小写和camelcase
  • 使用@JsonProperty("field-name")来匹配您的JSON密钥
  • ...

但在每种情况下,您都必须了解有关评估/评估列表的当前冲突。

答案 1 :(得分:0)

因为我必须使用第三方API提供给我的json,所以改变json不是一种选择。

以下是我的工作方式。

首先,我必须更改Assessments对象以获得具有单数名称的列表。 &#34;评估&#34;而不是&#34;评估&#34;因为这就是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对象&#34;结果。&#34;

在这些更改到位后,我将Java对象置于我期望的状态。