【问题标题】:Deserialize values in a tree structured JSON using Jackson使用 Jackson 反序列化树结构 JSON 中的值
【发布时间】:2016-09-15 00:08:53
【问题描述】:

需要使用 Jackson 反序列化如下所示的 JSON 结构,这是来自 REST API 的响应,我正在使用 Spring RestTemplate 和 MappingJackson2HttpMessageConverter 来解析它。

问题: 1. 所有元素都可以有一个或多个属于自己类型的子元素(例如,根有子元素:childABC & childAnyRandomName) 2.子节点没有标准的命名约定,名字可以是任意字符串。

{ "FooBar": { "root": { "name": "test1", "value": "900", "childABC": { "name": "test2", "value": "700", "childXYZ": { "name": "test3", "value": "600" } }, "childAnyRandomName": { "name": "test4", "value": "300" } } } }

据我了解,存储它的 POJO 可能是这样的:

import java.util.Map;

public class TestObject {

private String name;
private String value;
private Map<String, TestObject> children;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

public Map<String, TestObject> getChildren() {
    return children;
}

public void setChildren(Map<String, TestObject> children) {
    this.children = children;
}

}

我无法控制我正在解析的实际 JSON,因此如果 Jackson 不起作用,我将不得不将其全部推送到 JsonNode 中并使用自定义逻辑构建此对象结构。

免责声明:我对 Jackson 比较陌生,所以请不要介意这是否是我没有阅读过的经典教科书解决方案,只需将我指向文档位置即可。

【问题讨论】:

    标签: java json jackson deserialization resttemplate


    【解决方案1】:

    在你的 bean 中,拥有你知道的属性:

    private String blah;
    
    @JsonProperty("blah")
    @JsonSerialize(include = Inclusion.NON_NULL)
    public String getBlah() {
        return blah;
    }
    
    @JsonProperty("blah")
    public void setBlah(String blah) {
        this.blah = blah;
    }
    

    然后,添加以下内容,这有点像你没有明确映射出现在 JSON 上的任何属性的包罗万象:

    private final Map<String, JsonNode> properties = new HashMap<String, JsonNode>();
    
    @JsonAnyGetter
    public Map<String, JsonNode> getProperties() {
        return properties;
    }
    
    @JsonAnySetter
    public void setProperty(String key, JsonNode value) {
        properties.put(key, value);
    }
    

    或者,只需将已知的复杂对象映射到 Map 字段(IIRC,其下的复杂对象也将最终出现在映射中)。

    【讨论】:

    • 顺便说一句,我使用 Map 而不是 Map,它自动填充子对象。
    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多