使用 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,其下的复杂对象也将最终出现在地图中)。
需要像下面这样使用 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,其下的复杂对象也将最终出现在地图中)。