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

无需定义Java对象类时提取JSON指定值的最优方法是什么

Java 使用Jackson获取JSON数组中指定字段对应的属性值

实现思路

直接遍历information对应的JSON数组,匹配type字段值为orange的节点,匹配成功后直接提取该节点的url值即可,用Stream流可以写出非常简洁的实现代码。

完整代码示例

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Optional;
import java.util.stream.StreamSupport;

public class JsonParseDemo {
    public static void main(String[] args) throws Exception {
        // 你的JSON字符串
        String jsonStr = "{\n" +
                "    \"id\": \"abc\",\n" +
                "    \"title\": \"123.png\",\n" +
                "    \"description\": \"fruits\",\n" +
                "    \"information\": [\n" +
                "        {\"type\": \"apple\", \"url\": \"https://apple.com\"},\n" +
                "        {\"type\": \"orange\", \"url\": \"https://orange.com\"}\n" +
                "    ],\n" +
                "    \"versions\": 0\n" +
                "}";

        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(jsonStr);
        JsonNode infoArray = rootNode.get("information");

        // Stream流简洁实现
        Optional<String> orangeUrl = StreamSupport.stream(infoArray.spliterator(), false)
                // 增加字段存在判断,避免空指针
                .filter(node -> node.has("type") && node.has("url") && "orange".equals(node.get("type").asText()))
                .map(node -> node.get("url").asText())
                .findFirst();

        // 取出结果,不存在时返回默认空串
        String result = orangeUrl.orElse("");
        System.out.println(result); // 输出 https://orange.com
    }
}

普通循环版本(不使用Stream)

如果不习惯用Stream,也可以用普通for循环实现:

String targetUrl = "";
JsonNode infoArray = rootNode.get("information");
for (JsonNode node : infoArray) {
    if (node.has("type") && "orange".equals(node.get("type").asText())) {
        targetUrl = node.has("url") ? node.get("url").asText() : "";
        break; // 匹配到就直接跳出,无需遍历剩余元素
    }
}

注意事项

  • 代码里增加了has("type")、has("url")的判断,可以避免部分节点缺失对应字段时抛出空指针异常,稳定性更好
  • 两种实现都是遍历到第一个匹配的节点就停止,性能不会有问题,就算数组长度很大也不会有额外开销
  • 你之前用到的rootNode.at("/information")和代码里的rootNode.get("information")效果完全一致,直接替换即可

内容的提问来源于stack exchange,提问作者Mikasa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:05