如何使用JsonPath查询所有键名包含指定字符串的元素
JsonPath按键名模糊匹配的实现方案
标准JsonPath规范目前确实未原生支持键名的contains、正则匹配等能力,但主流的第三方JsonPath实现大多提供了非标准的扩展语法可以实现该需求,具体方案如下:
测试JSON结构
你提供的参考结构如下:
{ "find-this": "sample1", "test": { "find-this": "sample2", "test": [ { "find-this": "sample3", "test": "sample" } ] } }
注:你给出的预期返回示例不符合JSON语法规范,数组不能直接包含键值对,实际返回结果会是包含匹配值的数组 ["sample1","sample2","sample3"],或包含对应键值对对象的数组 [{"find-this":"sample1"},{"find-this":"sample2"},{"find-this":"sample3"}]
方案1:主流实现扩展语法(推荐)
Java生态的Jayway JsonPath、JavaScript生态的jsonpath-plus、Python生态的jsonpath-ng等常用实现都支持正则匹配键名的扩展能力,对应查询写法如下:
匹配所有键名包含this的节点
$..[?(@ =~ /.*this.*/)]
执行后直接返回匹配到的三个值:["sample1","sample2","sample3"],符合需求。
其他匹配规则扩展
调整正则部分即可实现不同匹配逻辑:
- 键名以
this结尾:$..[?(@ =~ /.*this$/)] - 键名以
find开头:$..[?(@ =~ /^find.*/)]
方案2:全兼容通用方案
如果你使用的JsonPath实现不支持上述扩展语法,可以通过两步操作实现:
- 用表达式
$..*递归查询出JSON中的所有节点 - 自行遍历查询结果,过滤出键名符合要求的条目即可
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

