JSONPath 之于 JSON,就如 XPath 之于 XML。JSONPath 可以方便对 JSON 数据结构进行内容提取。
JsonPath示例
下面是相应的JsonPath的示例,代码来源于JSONPath - XPath for JSON,JSON文档如下:
{"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95}, {"category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99}, {"category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99}, {"category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}],"bicycle": {"color": "red","price": 19.95}}
}
接下来我们看一下如何对这个文档进行解析:
XPath | JsonPath | Result |
---|
/store/book/author | $.store.book[*].author | 所有book的author节点 |
//author | $..author | 所有author节点 |
/store/* | $.store.* | store下的所有节点,book数组和bicycle节点 |
/store//price | $.store..price | store下的所有price节点 |
//book[3] | $..book[2] | 匹配第3个book节点 |
//book[last()] | $..book[(@.length-1)] ,或 $..book[-1:] | 匹配倒数第1个book节点 |
//book[position()<3] | $..book[0,1] &#xff0c;或 $..book[:2] | 匹配前两个book节点 |
//book[isbn] | $..book[?(&#64;.isbn)] | 过滤含isbn字段的节点 |
//book[price<10] | $..book[?(&#64;.price<10)] | 过滤price<10 的节点 |
//* | $..* | 递归匹配所有子节点 |
概览
-
根对象使用$
来表示&#xff0c;而无需区分是对象还是数组。
-
表达式可以使用.
&#xff0c;也可以使用[]
。如&#xff1a;
$.store.book[0].title
或 $[&#39;store&#39;][&#39;book&#39;][0][&#39;title&#39;]
-
表达式()
可用作显式名称或索引的替代&#xff0c;如&#xff1a;
$.store.book[(&#64;.length-1)].title
表示获取最后一个 book 的 title。
-
使用符号&#64;
表示当前对象。过滤器表达式通过语法支持&#xff0c;?()
如&#xff1a;
$.store.book[?(&#64;.price <10)].title
表示获取价格小于 10 的所有 book 的 title。
语法
#要点&#xff1a;
$
表示文档的根元素&#64;
表示文档的当前元素.node_name
或 [&#39;node_name&#39;]
匹配下级节点[index]
检索数组中的元素[start:end:step]
支持数组切片语法*
作为通配符&#xff0c;匹配所有成员..
子递归通配符&#xff0c;匹配成员的所有子元素()
使用表达式?()
进行数据筛选
JSONPath 语法和 XPath 对比&#xff1a;
XPath | JsonPath | 说明 |
---|
/ | $ | 文档根元素 |
. | &#64; | 当前元素 |
/ | . 或[] | 匹配下级元素 |
.. | N/A | 匹配上级元素&#xff0c;JsonPath不支持此操作符 |
// | .. | 递归匹配所有子元素 |
* | * | 通配符&#xff0c;匹配下级元素 |
&#64; | N/A | 匹配属性&#xff0c;JsonPath不支持此操作符 |
[] | [] | 下标运算符&#xff0c;根据索引获取元素&#xff0c;XPath索引从1开始&#xff0c;JsonPath索引从0开始 |
| | [,] | 连接操作符&#xff0c;将多个结果拼接成数组返回&#xff0c;可以使用索引或别名 |
N/A | [start:end:step] | 数据切片操作&#xff0c;XPath不支持 |
[] | ?() | 过滤表达式 |
N/A | () | 脚本表达式&#xff0c;使用底层脚本引擎&#xff0c;XPath不支持 |
() | N/A | 分组&#xff0c;JsonPath不支持 |
注意&#xff1a;
- JsonPath 的索引从
0
开始计数 - JsonPath 中字符串使用
单引号
表示&#xff0c;例如:$.store.book[?(&#64;.category&#61;&#61;&#39;reference&#39;)]
中的&#39;reference&#39;
你可以在 JSONPath Online Evaluator 站点进行验证JsonPath的执行效果。
参考文档&#xff1a;
- JSONPath - XPath for JSON
- Querying JSON with SelectToken