如何在JSONPath中匹配特定值?附实际场景查询示例
JSONPath特定值匹配解答
基于你提供的示例JSON数据测试,你编写的两条查询语句在支持正则匹配的标准JSONPath实现中均可正常运行,以下是详细说明及优化方案:
注意:正则相关写法仅在支持正则扩展的JSONPath实现中生效,部分轻量解析器(如部分Java、Python的简易JSONPath库)可能不支持该语法。
现有写法验证
- 第一条查询
$.phoneNumbers[?(@.type=~/iPhone/i)].number:可正确匹配type为iPhone(不区分大小写)的号码,返回结果为"0123-4567-8888" - 第二条查询
$..number[?(@=~/.*88/i)]:可匹配到包含连续88的号码,返回结果同上
优化/替代实现方案
1. 查询类型为iPhone的号码
如果不需要大小写模糊匹配,推荐使用等值判断写法,兼容性更强,适配不支持正则的轻量JSONPath解析器:
$.phoneNumbers[?(@.type == 'iPhone')].number
如果确实需要适配大小写不同的type取值(如iphone、IPhone等),保留原有正则写法即可。
2. 查询所有以88结尾的号码
原有正则写法未添加结尾锚定,存在误匹配风险:如果号码中间出现连续88也会被命中。优化后的正则写法如下,添加$锚定匹配字符串末尾,同时去掉无用的大小写匹配修饰符i:
$..number[?(@ =~ /.*88$/)]
如果你的运行环境支持JSONPath扩展函数,也可以用更直观的endsWith写法:
$..number[?(endsWith(@, '88'))]
内容的提问来源于stack exchange,提问作者Ruediger Jungbeck
相关产品推荐
相关产品推荐

