需要使用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中推送所有这些并使用自定义逻辑构建此对象结构。
免责声明:我对杰克逊来说比较新,所以请不要介意这是一本我没读过的经典教科书解决方案,只需指向文档位置即可。
答案 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,其下的复杂对象也将以地图结束)。