Jackson JsonNode 到类型集合

新手上路,请多包涵

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

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

还有另一种“正确”的方式还是其中之一?

原文由 kag0 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 847
2 个回答

获取 ObjectReaderObjectMapper#readerFor(TypeReference) 使用 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);

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果迭代器更有用……

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

样本.json

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

因此, List<String> 位于 JsonNode 之一内。

爪哇

当您将该内部节点转换为 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();

Jackson 对象映射器的新手?

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

更新:

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

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

来自 com.fasterxml.jackson.core:jackson-databind:2.11.0 的 javadocs

原文由 Mue 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题