Java Jackson JsonNode到类型化集合
将JacksonJava 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进行转换而感觉不对劲 还有其他“正确”的方法吗?还是其中
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();