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

使用com.jayway.jsonpath提取JSON根节点键名不生效问题咨询

问题原因

你用到的$.*~语法属于部分JsonPath实现的扩展功能,你引入的com.jayway.jsonpath:json-path:2.6.0版本默认不支持该波浪号取键名的语法,表达式会被识别为匹配根节点下的所有属性值,所以返回的是1212对应的数组内容。

可用解决方案

方案1:直接解析根节点取键名(最高效)

无需编写特殊JsonPath表达式,直接将根节点解析为Map后获取键集合即可:

// 你的JSON字符串
String jsonStr = "{\"1212\":[{\"size\":\"M\",\"colour\":\"RED\"},{\"size\":\"L\",\"colour\":\"BLUE\"},{\"size\":\"XL\",\"colour\":\"GREEN\"}]}";
Map<String, Object> root = JsonPath.read(jsonStr, "$");
// 提取根节点所有键
Set<String> rootKeys = root.keySet();
// 确定只有一个根键时直接取首个元素
String targetKey = rootKeys.iterator().next(); // 取值为"1212"

方案2:开启路径列表选项间接提取

如果需要通过JsonPath能力实现,可以开启AS_PATH_LIST配置项,先获取根下所有属性的路径,再从路径中提取键名:

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Option;

Configuration conf = Configuration.builder()
        .options(Option.AS_PATH_LIST)
        .build();
List<String> paths = JsonPath.using(conf).parse(jsonStr).read("$.*");
// 得到的路径格式为$['1212'],正则提取引号内的内容即可
String targetKey = paths.get(0).replaceAll("\\$\\['(.*)'\\]", "$1");

方案3:升级依赖版本兼容原有表达式

com.jayway.jsonpath从2.7.0版本开始正式支持~操作符获取键名,如果你可以调整依赖版本,直接升级依赖到2.7.0及以上版本,原有JsonPath.read(jsonStr, "$.*~")代码即可正常返回["1212"]结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:15:07