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
相关产品推荐
相关产品推荐

