Jackson JsonNode打字收藏

时间:2016-08-30 22:08:11

标签: java json jackson type-erasure

将Jackson JsonNode转换为java集合的正确方法是什么?

如果它是json字符串,我可以使用ObjectMapper.readValue(String, TypeReference),但对于JsonNode,唯一的选项是ObjectMapper.treeToValue(TreeNode, Class),它们不会提供类型集合,或{{1}因为它接受任何POJO转换而感觉不对。

还有另一个"正确"方式还是其中之一?

3 个答案:

答案 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)

如果Iterator更有用...

...您还可以使用elements()的{​​{1}}方法。示例见下文。

sample.json

ArrayNode

因此,{ "first": [ "Some string ...", "Some string ..." ], "second": [ "Some string ..." ] } 位于List<String>之一中。

Java

将内部节点转换为JsonNode时,可以使用ArrayNode方法,该方法返回JsonNodes的Iterator。

elements()

Jackson Object Mapper的新手吗?

我喜欢本教程: 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);