如何创建如下 Java 中给出的复杂结构的 JsonObject?
How to create a JsonObject of complex structure like given below in Java?
{
"A": {
"B": {
"C": {
"D": "123"
},
"E": {
"F": {
"G": "aaabbb"
},
"H": "QWE",
"I": {
"J": "003",
"K": "01"
}
},
"L": {
"M": {
"N": "1603",
"O": "QWE"
},
"P": "N",
"Q": "N"
},
"R": {
"S": "10000",
"T": "QWE"
},
"U": {
"V": "0",
"W": "13"
},
"X": {
"Y": "123456"
}
},
"ABC": {
"QQ": "5",
"WW": "O"
}
}
}
我想创建一个类似的 Json 字符串,而不必创建所有这些 类 A、B、C 等。我可以通过为每个 类 创建它这些标签 A、B、C 等使用 Jackson 库的 ObjectMapper。有没有更简单的方法来实现这个?
正如我在评论中所述,有几种方法。
嵌套地图
ObjectMapper om = new ObjectMapper();
Map<String, Map<String, Map<String, Map<String, Object>>>> map = new HashMap<>();
map.computeIfAbsent("A", k -> new HashMap<>())
.computeIfAbsent("B", k -> new HashMap<>())
.computeIfAbsent("C", k -> new HashMap<>())
.put("D", "123");
((Map<String, String>)map.computeIfAbsent("A", k -> new HashMap<>())
.computeIfAbsent("B", k -> new HashMap<>())
.computeIfAbsent("E", k -> new HashMap<>())
.computeIfAbsent("F", k -> new HashMap<String, String>()))
.put("G", "aaabbb");
String json = om.writeValueAsString(map);
像 computeIfAbsent()
这样的方法在必须始终检查中间映射的存在方面有很大帮助,但正如您所看到的,如果结构不统一,这可能会变得难以处理。
当然你也可以用其他方式来建图,这里只是一个简单的演示。
使用 ObjecNode(如果需要,还使用 ArrayNode)
ObjectMapper om = new ObjectMapper();
ObjectNode root = om.createObjectNode();
ObjectNode nodeA = om.createObjectNode();
root.set("A", nodeA);
ObjectNode nodeB = om.createObjectNode();
nodeA.set("B", nodeB);
ObjectNode nodeC = om.createObjectNode();
nodeB.set("C", nodeC);
nodeC.put("D", "123");
ObjectNode nodeE = om.createObjectNode();
nodeB.set("E", nodeE);
ObjectNode nodeF = om.createObjectNode();
nodeE.set("F", nodeF);
nodeF.put("G", "aaabbb");
String json = om.writeValueAsString(root);
同样,有多种方法可以构建此节点层次结构。
两个示例都产生以下(未格式化)json,它反映了结构的第一部分:
{"A":{"B":{"C":{"D":"123"},"E":{"F":{"G":"aaabbb"}}}}}
{
"A": {
"B": {
"C": {
"D": "123"
},
"E": {
"F": {
"G": "aaabbb"
},
"H": "QWE",
"I": {
"J": "003",
"K": "01"
}
},
"L": {
"M": {
"N": "1603",
"O": "QWE"
},
"P": "N",
"Q": "N"
},
"R": {
"S": "10000",
"T": "QWE"
},
"U": {
"V": "0",
"W": "13"
},
"X": {
"Y": "123456"
}
},
"ABC": {
"QQ": "5",
"WW": "O"
}
}
}
我想创建一个类似的 Json 字符串,而不必创建所有这些 类 A、B、C 等。我可以通过为每个 类 创建它这些标签 A、B、C 等使用 Jackson 库的 ObjectMapper。有没有更简单的方法来实现这个?
正如我在评论中所述,有几种方法。
嵌套地图
ObjectMapper om = new ObjectMapper();
Map<String, Map<String, Map<String, Map<String, Object>>>> map = new HashMap<>();
map.computeIfAbsent("A", k -> new HashMap<>())
.computeIfAbsent("B", k -> new HashMap<>())
.computeIfAbsent("C", k -> new HashMap<>())
.put("D", "123");
((Map<String, String>)map.computeIfAbsent("A", k -> new HashMap<>())
.computeIfAbsent("B", k -> new HashMap<>())
.computeIfAbsent("E", k -> new HashMap<>())
.computeIfAbsent("F", k -> new HashMap<String, String>()))
.put("G", "aaabbb");
String json = om.writeValueAsString(map);
像 computeIfAbsent()
这样的方法在必须始终检查中间映射的存在方面有很大帮助,但正如您所看到的,如果结构不统一,这可能会变得难以处理。
当然你也可以用其他方式来建图,这里只是一个简单的演示。
使用 ObjecNode(如果需要,还使用 ArrayNode)
ObjectMapper om = new ObjectMapper();
ObjectNode root = om.createObjectNode();
ObjectNode nodeA = om.createObjectNode();
root.set("A", nodeA);
ObjectNode nodeB = om.createObjectNode();
nodeA.set("B", nodeB);
ObjectNode nodeC = om.createObjectNode();
nodeB.set("C", nodeC);
nodeC.put("D", "123");
ObjectNode nodeE = om.createObjectNode();
nodeB.set("E", nodeE);
ObjectNode nodeF = om.createObjectNode();
nodeE.set("F", nodeF);
nodeF.put("G", "aaabbb");
String json = om.writeValueAsString(root);
同样,有多种方法可以构建此节点层次结构。
两个示例都产生以下(未格式化)json,它反映了结构的第一部分:
{"A":{"B":{"C":{"D":"123"},"E":{"F":{"G":"aaabbb"}}}}}