1. 概述
JsonPath 表达式可用于解析 JSON 结构的数据,官方 API 文档:https://github.com/json-path/JsonPath,本文仅为对英文官方文档的翻译。
2. 基础运算符
JsonPath 的根元素总是被称为 $,无论它是一个对象还是数组。
在 JsonPath 表达式中,可以使用点符号,例如:$.store.book[0].title;也可以使用方括号,例如:$['store']['book'][0]['title']。
运算符 | 描述 |
---|---|
$ | 根元素 |
. 或 [] | 获取子元素 如:store.book 或 store["book"] |
.. | 后代选择器,用来选取所有符合条件的元素 |
[,] | 合并操作符,用于选取若干个元素 如:book[0,1] 或 $..book[0].["category","author"] |
[start:end] | 切片运算符,索引的起始值为 0 ,左闭右开 如:book[0:2] 或 book[-2:0] |
?() | 过滤器标识,用于筛选数组,可以将过滤条件写在括号中 |
@ | 表示当前正在被过滤器处理的元素,通常和过滤器配合使用 如:book[?(@.price<10)] |
* | 通配符。可以用于通配元素的名称或索引 如:book.* 或 book[*] 也可以和过滤结合使用,作为正则表达式的元素 如:book[?(@.author =~ /.*ees/)] |
3. 过滤运算符
过滤器是用于筛选数组的逻辑表达式,一个典型的过滤器是[?(@.age > 18)] ,其中,@ 表示当前正被过滤器处理的元素。通过加入逻辑运算符 && 和 || ,可以创造出更复杂的过滤器。字符串的值必须使用单引号或双引号括起来,如 ([?(@.color == 'blue')] 或[?(@.color == "blue")])。
运算符 | 描述 |
---|---|
== | 左右相等 注:会对比数据类型,如 1 和 '1' 不相等 |
!= | 左右不相等 |
< | 左侧小于右侧 |
<= | 左侧小于或等于右侧 |
> | 左侧大于右侧 |
>= | 左侧大于或等于右侧 |
=~ | 左侧符合右侧的正则表达式 如:[?(@.name =~ /foo.*?/i)] |
in | 左侧存在于右侧 如:[?(@.size in ['S', 'M'])] |
nin | |
subsetof | [?(@.sizes subsetof ['S', 'M', 'L'])] |
anyof | [?(@.sizes anyof ['M', 'L'])] |
noneof | [?(@.sizes noneof ['M', 'L'])] |
size | |
empty |
4. 函数
可以在路径的末端调用函数。
函数 | 描述 | 输出类型 |
---|---|---|
min() | ||
max() | ||
avg() | ||
stddev() | ||
length() | ||
sum() |
示例:
假设有这样一个 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
}
},
"expensive": 10
}
JsonPath 表达式 | 结果 |
---|---|
$.store.book[*].author | 找到 store 元素下的所有书籍,输出他们的作者 |
$..author | 根元素下所有的作者 |
$.store.* | store 元素下所有的东西,无论是书籍还是自行车 |
$.store..price | store 元素下的所有东西的价格 |
$..book[2] | 第 3 本书 |
$..book[-2] | 倒数第 2 本书 |
$..book[0,1] $..book[:2] | 前2本书 |
$..book[:2] | 前2本书(注意:第一本书的索引是0) |
$..book[1:2] | 第2本书 |
$..book[-2:] | 最后第2本和最后第1本书 |
$..book[2:] | 第3到最后1本书 |
$..book[?(@.isbn)] | 所有书籍中,含有 isbn 属性的书籍 |
$.store.book[?(@.price < 10)] | 所有书籍中,价格低于10的书籍 |
$..book[?(@.price <= $['expensive'])] | 所有数据中,价格没有超过 expensive 的书籍( expansive 的值为10) |
$..book[?(@.author =~ /.*REES/i)] | 找出符合正则表达式的书籍。 此正则表达式的含义:作者名以REES结尾,REES不区分大小写 |
$..* | 输出根元素下的所有内容 |
$.store.book.length() | 书籍的总数 |