如何使用XPATH/JSONPATH筛选名称为forecast_XXX的JSON对象?
如何用JSONPath/XPath筛选以
forecast_XXX命名的JSON对象 嘿,我来帮你搞定这个筛选需求!针对你给出的JSON结构,我分两种情况给你讲清楚——**JSONPath(处理JSON的首选)和XPath(需要适配JSON场景)**的实现方式:
一、用JSONPath筛选(推荐)
JSONPath是专门为JSON设计的查询语言,语法更贴合JSON结构。要筛选所有以forecast_开头、后面跟数字(比如forecast_1、forecast_2)的顶层对象,你可以用带正则匹配的过滤表达式:
通用表达式(适配多数JSONPath实现)
$.*[?(@property =~ /^forecast_\d+$/)]
表达式拆解:
$:代表JSON的根节点.*:匹配根节点下的所有属性(也就是所有顶层键值对)[?()]:过滤条件,只保留满足括号内规则的项@property:指代当前属性的名称(有些JSONPath实现用@key,比如Jayway JSONPath,注意区分)=~ /^forecast_\d+$/:用正则匹配属性名,^forecast_\d+$表示“以forecast_开头,后面跟着一个或多个数字,直到结尾”
针对你给出的JSON示例
这个表达式会精准返回forecast_1对应的整个对象:
{ "country": "Rwanda", "forecast_date": "2018-03-20", "province": "Kigali City", "district": "Kigali", "morning": {...}, "afternoon": {...} }
二、用XPath筛选(需适配JSON场景)
XPath原本是为XML设计的,要处理JSON的话,通常需要两种方式:要么把JSON转换成XML结构,要么使用支持JSON的XPath 3.1及以上版本。
方式1:XPath 3.1+直接处理JSON
如果你的工具支持XPath 3.1(比如Saxon),可以用以下表达式:
json-doc('your-json-file.json')?*[matches(node-name(.), '^forecast_\d+$')]
json-doc():加载指定的JSON文件?*:选择JSON顶层的所有成员matches(node-name(.), '^forecast_\d+$'):匹配成员名称是否符合正则规则
方式2:先转XML再用XPath筛选
如果先把JSON转换成XML(比如forecast_1会变成<forecast_1>元素),可以用更基础的XPath表达式:
/*[starts-with(local-name(), 'forecast_')]
/*:选择XML根节点下的所有子元素starts-with(local-name(), 'forecast_'):筛选出名称以forecast_开头的元素
注意事项
- 不同JSONPath工具的语法细节可能有差异,比如Jayway JSONPath用
@key代替@property,表达式会变成$.*[?(@key =~ /^forecast_\d+$/)],使用前最好确认工具的文档。 - 如果
forecast_XXX后面的后缀不是数字(比如字母),可以把正则改成/^forecast_.+$/,匹配任意后缀。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

