Jackson的JsonNode迭代时如何同时获取key与value
问题原因
你调用的JsonNode.iterator()方法本身仅返回节点的属性值,该方法主要面向数组类型的JsonNode设计,用于遍历数组内的元素,因此遍历对象类型的JsonNode时无法获取对应的属性key。
正确遍历方法
1. 对象类型JsonNode(对应你转换的User类对象场景)
调用fields()方法即可获取包含键值对的迭代器,示例代码如下:
val mapper = ObjectMapper() val node = mapper.valueToTree<JsonNode>(userData) // 遍历所有键值对 node.fields().forEachRemaining { entry -> val key = entry.key val value = entry.value // 输出示例:"name": John println("\"$key\": ${value.asText()}") }
如果需要用传统迭代器写法也可以用while循环实现:
val fieldIterator = node.fields() while (fieldIterator.hasNext()) { val (key, value) = fieldIterator.next() // 业务处理逻辑 }
2. 数组类型JsonNode适配
如果你的JsonNode是数组类型,本身没有自定义属性key,仅存在下标索引,可以用以下方式遍历:
if (node.isArray) { node.forEachIndexed { index, valueNode -> println("索引$index: ${valueNode.asText()}") } }
注意事项
- 遍历前建议先通过
node.isObject判断节点类型,避免类型不匹配报错 - 如果属性值不是字符串类型,不要直接调用
asText(),可根据实际类型调用asInt()、asBoolean()等方法,或直接操作JsonNode对象完成后续逻辑
内容的提问来源于stack exchange,提问作者John H
相关产品推荐
相关产品推荐

