JSONPath 学习笔记
什么是 JSONPath?
JSONPath 是一种类似于 XPath 的查询语言,用于在 JSON 数据中定位和提取特定部分的数据。它提供了一种简洁而强大的方式来导航和检索 JSON 结构中的元素,使得我们可以轻松地从复杂的 JSON 数据中提取所需的信息。
JSONPath表达式
JSONPath引用JSON结构,就像XPath表达式引用XML文档一样。由于JSON结构通常是匿名的,不一定有“根成员对象”,JSONPath假定为最外层对象的抽象名称为$
。
JSONPath表达式可使用点符
$.store.book[0].title
或者是括号符
$['store']['book'][0]['title']
f用于输入路径。内部或输出路径将始终转换为更通用的括号符。
JSONPath允许使用通配符*
表示成员名和数组索引。它借用了后代运算符..
来自E4X以及来自ECMASCRIPT 4的数组切片语法提议 [start:end:step]
。
底层脚本语言 (<expr>)
的表达式可以用作显式名称或索引的替代方案,如
$.store.book[(@.length-1)].title
使用符号@
表示当前对象。通过语法 ?(<boolean expr>)
支持筛选表达式,如
$.store.book[?(@.price < 10)].title
以下是JSONPath语法元素与其XPath对应元素的完整概述和并排比较。
XPath | JSONPath | 描述 |
---|---|---|
/ |
$ |
根对象/元素 |
. |
@ |
当前对象/元素 |
/ |
. 或 [] |
获取子元素操作 |
.. |
无 | 获取父元素操作 |
// |
.. |
递归下降操作符(后代选择器),用于访问所有匹配的元素,无论它们在JSON结构中的深度如何。 |
* |
* |
通配符。匹配所有对象/元素名称或索引。 |
@ |
无 | 访问属性。 JSON结构没有属性。 |
[] |
[] |
下标运算符。XPath使用它来迭代元素集合和谓词. 在Javascript和JSON中,它是原生数组运算符。 |
` | ` | [,] |
无 | [start:end:step] |
从ES4借鉴的数组切片运算符 |
[] |
?() |
应用筛选器(脚本)表达式。 |
无 | () |
使用底层脚本引擎的脚本表达式。 |
() |
无 | Xpath中的分组 |
XPath提供的(非缩写语法的位置路径、运算符和函数)比这里列出的要多得多。此外,Xpath和JSONPath中下标运算符的工作方式存在显著差异。
- Path表达式中的方括号始终对括号之前这段路径获取的节点集进行操作。索引始终以1开头。
- 使用JSONPath方括号对括号之前这段路径获取的对象或数组进行操作。索引始终以0开头。
JSONPath 示例
{
"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 |
获取store中所有book的author |
//author |
$..author |
获取所有authors |
/store/* |
$.store.* |
获取store中的所有东西, 即一些book和bicyle,输出显示上述示例JSON中"book"和"bicyle"键对应值 |
/store//price |
$.store..price |
获取store中所有东西的price |
//book[3] |
$..book[2] |
获取第三个book |
//book[last()] |
$..book[(@.length-1)] $..book[-1:] |
按序获取最后一个book |
//book[position()<3] |
$..book[0,1] $..book[:2] |
获取前两个book |
//book[isbn] |
$..book[?(@.isbn)] |
获取所有isbn号为真的book |
//book[price<10] |
$..book[?(@.price<10)] |
获取所有price小于10的book |
//* |
$..* |
获取XML文档中的所有元素。JSON结构中的所有成员。 |
说明:
-
过滤器支持常见的逻辑运算符:与(
&&
)、或(||
),非(!
)。示例: 获取所有price小于10且cateogry等于reference的book
$.store.book[?(@.price < 10 && @.category == "reference")]
参考链接
作者:授客
微信/QQ:1033553122
全国软件测试QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏
支付宝打赏 全国软件测试交流QQ群