Jackson JsonNode打字收藏

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

获取ObjectReaderObjectMapper#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)

  • 在较旧的Jackson版本(2.5及更低版本)中,没有readerFor()方法。请改用reader()方法。 (3认同)

Dan*_*anJ 8

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)


Mue*_*Mue 6

如果迭代器更有用...

...您也可以使用 的elements()方法ArrayNode。示例见下文。

示例.json

{
    "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