繁体   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