Java Jackson JsonNode到类型化集合

Java Jackson JsonNode到类型化集合,java,json,collections,jackson,type-erasure,Java,Json,Collections,Jackson,Type Erasure,将JacksonJsonNode转换为java集合的正确方法是什么 如果是json字符串,我可以使用ObjectMapper.readValue(string,TypeReference),但对于JsonNode来说,唯一的选项是ObjectMapper.treeToValue(TreeNode,Class),它不会给出类型化的集合,或者ObjectMapper.convertValue(Object,JavaType)因为接受任何POJO进行转换而感觉不对劲 还有其他“正确”的方法吗?还是其中

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

如果是json字符串,我可以使用
ObjectMapper.readValue(string,TypeReference)
,但对于
JsonNode
来说,唯一的选项是
ObjectMapper.treeToValue(TreeNode,Class)
,它不会给出类型化的集合,或者
ObjectMapper.convertValue(Object,JavaType)
因为接受任何POJO进行转换而感觉不对劲

还有其他“正确”的方法吗?还是其中之一?

使用描述所需类型集合的方法获取。然后使用解析(可能是一个)

例如,要从只包含JSON字符串的JSON数组中获取
列表

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);
ObjectMapper mapper=new ObjectMapper();
//示例JsonNode
JsonNode arrayNode=mapper.createArrayNode().add(“一”).add(“两”);
//获取正确类型的读卡器
ObjectReader=mapper.reader(新类型引用(){
});
//使用它
List=reader.readValue(arrayNode);
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, new TypeReference<Map<String, List<String>>>() {});
List List=new ArrayList();
列表。添加(“一”);
列表。添加(“两个”);
Map hashMap=新hashMap();
hashMap.put(“myList”,list);
ObjectMapper mapper=新的ObjectMapper();
ObjectNode ObjectNode=mapper.convertValue(hashMap,ObjectNode.class);
Map hashMap2=mapper.convertValue(objectNode,new TypeReference(){});
如果迭代器更有用。。。 …您还可以使用
ArrayNode
elements()
方法。示例见下文

sample.json 因此,
列表
位于一个
JsonNode
s中

JAVA 将该内部节点转换为
ArrayNode
时,可以使用
elements()
方法,该方法返回JsonNodes的迭代器

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();
File File=new文件(“src/test/resources/sample.json”);
ObjectMapper mapper=新的ObjectMapper();
JsonNode=mapper.readTree(文件);
ArrayNode ArrayNode=(ArrayNode)jsonNode.get(“第一”);
迭代器itr=arrayNode.elements();
//要从其中一个元素获取字符串,请使用例如。。。
itr.next().asText();
Jackson对象映射器的新功能? 我喜欢这个教程:

更新: 您还可以使用
ArrayNode
.iterator()
方法。这是一样的:

和打电话一样
.elements()
;实现这样,就可以方便地实现“for each”循环 用于在JSON数组构造的元素上循环

在较旧的jackson版本(2.5及以前版本)中,从
com.fasterxml.jackson.core:jackson数据绑定:2.11.0

的javadocs中,没有readerFor()方法。请改用reader()方法。
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();