从JsonNode提取指定key的value值报错,求解决方案
问题描述
我有如下结构的JsonNode结果:
[{ "item": { "type": "uri", "value": "http://www.wikidata.org/entity/Q42442324" }, "prop": { "type": "uri", "value": "http://www.wikidata.org/prop/direct/P21" }, "itemLabel": { "xml:lang": "en", "type": "literal", "value": "Kiisu Miisu" } }, { "item": { "type": "uri", "value": "http://www.wikidata.org/entity/Q43260736" }, "prop": { "type": "uri", "value": "http://www.wikidata.org/prop/direct/P21" }, "itemLabel": { "xml:lang": "en", "type": "literal", "value": "Paddles" } } ]
我尝试用以下代码提取所有value键的值到ArrayList,却报错:
Cannot invoke "com.fasterxml.jackson.databind.JsonNode.findValue(String)" because the return value of "com.fasterxml.jackson.databind.JsonNode.get(int)" is null
错误代码:
for (int i = 0; i < resultSize; i++) { JsonNode jsonObject = results.get(i); if (indexRow < jsonObject.size()) { jsonRows = Collections.singletonList(jsonObject.get(indexRow++).findValue("value").asText()); } }
调试时第一次循环的jsonObject值为:
{ "item": { "type": "uri", "value": "http://www.wikidata.org/entity/Q42442324" }, "prop": { "type": "uri", "value": "http://www.wikidata.org/prop/direct/P21" }, "itemLabel": { "xml:lang": "en", "type": "literal", "value": "Kiisu Miisu" } }
预期输出(修正原笔误后的正确结果):
["http://www.wikidata.org/entity/Q42442324", "http://www.wikidata.org/prop/direct/P21", "Kiisu Miisu", "http://www.wikidata.org/entity/Q43260736", "http://www.wikidata.org/prop/direct/P21", "Paddles" ]
问题原因
你错误地用get(int)访问对象类型的JsonNode:jsonObject是JSON对象(键值对结构),而非JSON数组,get(int)仅适用于数组类型的JsonNode,调用后返回null,触发空指针异常。另外,Collections.singletonList每次只会创建单元素列表,无法实现结果累加。
解决方案
遍历顶层数组的每个对象,再遍历对象内的所有子节点,提取每个子节点中的value值并添加到ArrayList中。代码示例:
List<String> jsonRows = new ArrayList<>(); // 遍历顶层数组的每个对象元素 for (JsonNode jsonObject : results) { // 遍历当前对象的所有子节点(item、prop、itemLabel) for (JsonNode childNode : jsonObject) { // 提取子节点中的value值,判空后添加到列表 JsonNode valueNode = childNode.findValue("value"); if (valueNode != null) { jsonRows.add(valueNode.asText()); } } }
代码说明
- 初始化
ArrayList存储结果,替代Collections.singletonList实现结果累加。 - 用增强for循环遍历顶层数组,比索引循环更简洁安全。
- 内层循环遍历当前对象的所有子节点,无需关注键名,直接处理每个子节点。
- 添加
valueNode != null的判空逻辑,避免潜在的空指针异常。
内容的提问来源于stack exchange,提问作者altz
相关产品推荐
相关产品推荐

