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还提供