kag*_*ag0 16 java json type-erasure jackson
将Jackson转换JsonNode为java集合的正确方法是什么?
如果它是一个JSON字符串我可以使用ObjectMapper.readValue(String, TypeReference),但对于一个JsonNode唯一的选择是ObjectMapper.treeToValue(TreeNode, Class)这不会给一个类型集合,或者ObjectMapper.convertValue(Object, JavaType)这是考虑其接受转换任何POJO的感觉错了.
还有其他"正确"方式还是其中之一?
Sot*_*lis 30
获取ObjectReader与ObjectMapper#readerFor(TypeReference)使用TypeReference描述你想要的类型集合.然后ObjectReader#readValue(JsonNode)用来解析JsonNode(大概是一个ArrayNode).
例如,获取一个List<String>仅包含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);
Run Code Online (Sandbox Code Playgroud)
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>>>() {});
Run Code Online (Sandbox Code Playgroud)
...您也可以使用 的elements()方法ArrayNode。示例见下文。
{
"first": [
"Some string ...",
"Some string ..."
],
"second": [
"Some string ..."
]
}
Run Code Online (Sandbox Code Playgroud)
所以,List<String>是在JsonNodes之一内。
当您将该内部节点转换为一个时,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();
Run Code Online (Sandbox Code Playgroud)
我喜欢这个教程:https : //www.baeldung.com/jackson-object-mapper-tutorial
您也可以使用 的.iterator()方法ArrayNode。这是相同的:
与调用相同
.elements();实现,以便方便的“for-each”循环可用于循环 JSON 数组构造的元素。
来自 javadocs com.fasterxml.jackson.core:jackson-databind:2.11.0