JSONPath 是一种类似于 XPath 的查询语言,用于在 JSON 数据中定位和提取特定部分的数据。它提供了一种简洁而强大的方式来导航和检索 JSON 结构中的元素,使得我们可以轻松地从复杂的 JSON 数据中提取所需的信息。
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中下标运算符的工作方式存在显著差异。
{
"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")]