Jackson JsonNode to typed Collection如果迭代器更有用...

2022-09-01 15:02:04

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

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

有没有另一种“正确”的方式,或者它是其中之一?


答案 1

使用 ObjectMapper#readerFor(TypeReference) 获取 ObjectReader,使用描述所需类型化集合的 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);

答案 2

如果迭代器更有用...

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

sample.json

{
    "first": [
        "Some string ...",
        "Some string ..."
    ],
    "second": [
        "Some string ..."
    ]
}

所以,在其中一个s里面。List<String>JsonNode

爪哇岛

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

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();

杰克逊对象映射器的新手?

我喜欢这个教程:https://www.baeldung.com/jackson-object-mapper-tutorial

更新:

您也可以使用 的方法。它是相同的:.iterator()ArrayNode

与呼叫相同 ;实现,以便方便的“for-each”循环可用于循环JSON数组构造的元素。.elements()

从 javadocs 的com.fasterxml.jackson.core:jackson-databind:2.11.0