历史版本19 :JSONPath表达式 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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()

书籍的总数