将Jackson JsonNode
转换为java集合的正确方法是什么?
如果它是json字符串,我可以使用ObjectMapper.readValue(String, TypeReference)
,但对于JsonNode
,唯一的选项是ObjectMapper.treeToValue(TreeNode, Class)
,它们不会提供类型集合,或{{1}因为它接受任何POJO转换而感觉不对。
还有另一个"正确"方式还是其中之一?
答案 0 :(得分:21)
使用描述所需类型集合的ObjectReader
获取ObjectMapper#readerFor(TypeReference)
TypeReference
。然后使用ObjectReader#readValue(JsonNode)
来解析JsonNode
(可能是ArrayNode
)。
例如,从仅包含JSON字符串的JSON数组中获取List<String>
ObjectMapper mapper = new ObjectMapper();
// example JsonNode
JsonNode arrayNode = mapper.createArrayNode().add("one").add("two");
// acquire reader for the right type
ObjectReader reader = mapper.readerFor(new TypeReference<List<String>>() {
});
// use it
List<String> list = reader.readValue(arrayNode);
答案 1 :(得分:2)
...您还可以使用elements()
的{{1}}方法。示例见下文。
ArrayNode
因此,{
"first": [
"Some string ...",
"Some string ..."
],
"second": [
"Some string ..."
]
}
位于List<String>
之一中。
将内部节点转换为JsonNode
时,可以使用ArrayNode
方法,该方法返回JsonNodes的Iterator。
elements()
我喜欢本教程: https://www.baeldung.com/jackson-object-mapper-tutorial
您还可以使用File file = new File("src/test/resources/sample.json");
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(file);
ArrayNode arrayNode = (ArrayNode) jsonNode.get("first");
Iterator<JsonNode> itr = arrayNode.elements();
// and to get the string from one of the elements, use for example...
itr.next().asText();
的{{1}}方法。一样:
与通话相同
.iterator()
;实现方便的“ for-each”循环 用于循环遍历JSON数组构造的元素。
来自ArrayNode
的Javadocs
答案 2 :(得分:1)
ObjectMapper.convertValue()函数方便且可识别类型。它可以在树节点和Java类型/集合之间执行各种各样的转换,反之亦然。
您可以如何使用它的示例:
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
Map<String,List<String>> hashMap = new HashMap<>();
hashMap.put("myList", list);
ObjectMapper mapper = new ObjectMapper();
ObjectNode objectNode = mapper.convertValue(hashMap, ObjectNode.class);
Map<String,List<String>> hashMap2 = mapper.convertValue(objectNode, HashMap.class);