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

Deserialize values in a tree structured JSON using Jackson

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

问题: 1. 所有元素都可以有一个或多个属于自己类型的子元素(例如 root 有子元素: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 比较陌生,所以请不要介意这是不是我没读过的经典教科书解决方案,只需将我指向文档位置即可。

在你的 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,其下的复杂对象也将最终出现在地图中)。