JSONPath 解析 JSON 内容详解(自 github)

Github :https://github.com/json-path/JsonPath

http://www.ibloger.net/article/2329.html

JSONPath Online Evaluator:http://jsonpath.com

JsonPath 是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。JsonPath 提供的 json 解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的 json 内容.

JsonPath 表达式总是引用 JSON 结构,其方式与XPath表达式解析XML文档的方式类似。JsonPath中的 “根成员对象” 总是被引用为$,不管它是对象还是数组。

JsonPath 可以使用 点 表示法:$.store.book[0].title
或者 括号 表示法:$['store']['book'][0]['title']

操作符

操作符 和 描述

操作符 描述
$ 查询根元素。这将开始所有路径表达式
@ 使用过滤谓词来处理当前节点。即过滤当前节点。
* 通配符。 任何可以使用名称和数字的地方都可以使用。
.. 深层扫描。 任何可以使用名称的地方都可以使用
.<name> 点,表示子节点。
['<name>' (, '<name>')] 括号 表示子项。
[<number> (, <number>)] 数组索引 或 索引
[start:end] 数组切片操作。
[?(<expression>)] 过滤表达式。 表达式的结果必须是一个 bool 值。

函数

函数可以在路径的末尾调用——函数的输入是路径表达式的输出。函数输出由函数本身决定。

函数 描述 输出
min() 提供数字数组的最小值 Double
max() 提供数字数组的最大值 Double
avg() 提供数字数组的平均值 Double
stddev() 提供数字数组的标准偏差值 Double
length() 提供数组的长度 Integer
sum() 提供数字数组的所有元素的和 Double

过滤器运算符

过滤器 是 用于筛选数组的逻辑表达式。一个典型的过滤器应该是 [?(@.age > 18)],其中 @ 表示当前正在处理的项。可以使用逻辑运算符 &&|| 创建更复杂的过滤器。字符串文字 必须用 单引号 或 双引号 括起来 ([?(@.color == 'blue')] or [?(@.color == "blue")])。

操作符 描述
== 左边得值 等于 右边的值 ( 注意:数字 1 不等于 字符串 '1' )
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
=~ 匹配正则表达式  [?(@.name =~ /foo.*?/i)]
in 左边 in 右边 [?(@.size in ['S', 'M'])]
nin 左边 not in 右边
subsetof 左边是右边的一个子字符串 [?(@.sizes subsetof ['S', 'M', 'L'])]
anyof 左边和右边相交 [?(@.sizes anyof ['M', 'L'])]
noneof 左边和右边不相交 [?(@.sizes noneof ['M', 'L'])]
size (数组或字符串)长度
empty (数组或字符串)为空

示例

示例 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 表达式示例:

JsonPath ( 点击链接测试 ) 结果
$.store.book[*].author 获取 Json 中 store下book下的所有author值
$..author 获取 Json 中 所有 author 的值。
$.store.* 获取 store 下所有东西( book 和 bicycle )
$.store..price 获取 store下以及所有子节点下的所有 price
$..book[2] 获取 book数组的第3个值
$..book[-2] 获取 book数组的倒数第二个值
$..book[0,1] 获取 book数组的第一、第二的值
$..book[:2] 获取 book数组从索引 0 (包括) 到 索引 2 (不包括) 的所有值 
$..book[1:2] 获取 book数组从索引 1 (包括) 到 索引 2 (不包括) 的所有值 
$..book[-2:] 获取 book数组从索引 -2 (包括) 到 结尾 的所有值
$..book[2:] 获取 book数组从索引 2 (包括) 到 结尾 的所有值
$..book[?(@.isbn)] 获取 所有节点以及子节点中 book 数组包含 isbn 的所有值
$.store.book[?(@.price < 10)] 获取 store下 book 数组中 price < 10 的所有值
$..book[?(@.price <= $['expensive'])] 获取 所有节点以及子节点下 book 数组中 price <= expensive 的所有值
$..book[?(@.author =~ /.*REES/i)] 获取所有匹配正则的 book ( 不区分大小写 )
$..*

逐层列出 json 中 的所有值,层级由外到内

$..book.length() book 数组的长度

阅读文档

使用 JsonPath 的最简单的最直接的方法是通过静态读取 API。

String json = "...";

List<String> authors = JsonPath.read(json, "$.store.book[*].author");

如果你只想读取一次,那么上面的代码就可以了。如果你还想读取其他路径,现在上面不是很好的方法,因为他每次获取都需要再解析整个文档。所以,我们可以先解析整个文档,再选择调用路径。

String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);

String author0 = JsonPath.read(document, "$.store.book[0].author");
String author1 = JsonPath.read(document, "$.store.book[1].author");

JsonPath还提供

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值