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

Java如何从结构动态变化的JSONObject中获取指定数据?

动态获取JSON中指定键值的方法

1. 实现递归遍历工具方法

自己写一个递归遍历逻辑,不管JSON结构是对象还是数组,逐层扫描所有节点,找到目标键就返回对应值。以Java的org.json库为例:

public static Object findTargetValue(Object jsonNode, String targetKey) {
    // 处理JSONObject节点
    if (jsonNode instanceof JSONObject) {
        JSONObject jsonObj = (JSONObject) jsonNode;
        // 当前节点直接包含目标键,返回值
        if (jsonObj.has(targetKey)) {
            return jsonObj.get(targetKey);
        }
        // 遍历当前节点的所有子节点
        for (String key : jsonObj.keySet()) {
            Object result = findTargetValue(jsonObj.get(key), targetKey);
            if (result != null) {
                return result;
            }
        }
    }
    // 处理JSONArray节点
    else if (jsonNode instanceof JSONArray) {
        JSONArray jsonArr = (JSONArray) jsonNode;
        // 遍历数组中的每个元素
        for (int i = 0; i < jsonArr.length(); i++) {
            Object result = findTargetValue(jsonArr.get(i), targetKey);
            if (result != null) {
                return result;
            }
        }
    }
    // 非JSON对象/数组,直接返回null
    return null;
}

用法

调用时直接传入你的根JSONObject和目标键(比如"Name"):

String name = (String) findTargetValue(yourRootJsonObject, "Name");

如果需要获取所有同名键的值,只需修改方法,把找到的结果存入List再返回即可。

2. 使用JSONPath表达式(第三方库方案)

如果允许引入第三方库,JSONPath是更高效简洁的选择,它支持跨层级的键匹配。以Jayway JsonPath库为例:

示例代码

// 读取单个匹配值(第一个找到的Name)
String name = JsonPath.read(yourJsonString, "$..Name");

// 读取所有层级下的Name值,存入List
List<String> allNames = JsonPath.read(yourJsonString, "$..Name");

表达式$..Name的含义是:从根节点开始,匹配所有层级中键为Name的节点。

注意事项

  • 若JSON中存在多个同名键,需明确需求是取第一个还是全部结果;
  • 递归方法需注意处理空值,若JSON存在循环引用(极少出现),需额外添加判断避免死循环;
  • 使用第三方库时,需确保项目引入对应依赖(比如Maven/Gradle依赖)。

内容的提问来源于stack exchange,提问作者Mhamad Abu AlGhanam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:45:26