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

