使用Jackson反序列化树形结构JSON中的值

时间:2016-09-15 00:08:54

标签: java json jackson deserialization resttemplate

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

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

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; } }

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

{{1}}

我无法控制我正在解析的实际JSON,所以如果Jackson无法工作,我将不得不在JsonNode中推送所有这些并使用自定义逻辑构建此对象结构。

免责声明:我对杰克逊来说比较新,所以请不要介意这是一本我没读过的经典教科书解决方案,只需指向文档位置即可。

1 个答案:

答案 0 :(得分:3)

在你的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);
}

或者,只需将已知的复杂对象映射到地图字段(IIRC,其下的复杂对象也将以地图结束)。