You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:54:22