jsonpath是一个极其强大的解析json文档的工具,jsonpath强大的语法可以帮助你定位json文档中任一你想要的数据。jsonpath提供了多种语言的实现,在Java, JavaScript, PHP,Python等语言中都能完美解析,不用担心切换语言之后就需要改代码的情况。下面将简要介绍一下jsonpath语法,以及在python中的使用,以下面一组数据为例:
obj = {
"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
}
操作符 | 描述 |
---|---|
$ | 查询根元素 |
@ | 过滤正在处理的当前节点 |
* | 通配符。可在任何需要名称或数字的地方使用 |
… | 深层扫描,在任何需要名称的地方使用 |
. |
获取子节点 |
[’ |
获取一个或多个子节点 |
[ |
获取一个或多个数组下标索引 |
[start:end] | 切片数组运算符 |
[?( |
过滤表达式。表达式必须计算为布尔值 |
函数 | 描述 |
---|---|
min() | 获取数字数组的最小值 |
max() | 获取数字数组的最大值 |
avg() | 获取数字数组的平均值 |
stddev() | 获取数字数组的标准差值 |
length() | 获取数组的长度 |
sum() | 获取数字数组的和 |
keys() | 获取字典的键 |
操作符 | 描述 |
---|---|
== | 左边等于右边,注意: 1不等于’1’ |
!= | 左边不等于右边 |
< | 左边小于右边 |
<= | 左边小于等于右边 |
> | 左边大于右边 |
>= | 左边大于等于右边 |
=~ | 左边匹配正则表达式 |
in | 左边存在于右边 |
nin | 左边不存在于右边 |
subsetof | 左边是右边的子集 |
anyof | 左边与右边有交集 |
noneof | 左边与右边没有交集 |
size | 左边(数组或字符串)的大小应与右边匹配 |
empty | 左(数组或字符串)应该是空的 |
pip install pyjsonpath
book数组的前两个数据
>>> from pyjsonpath import JsonPath
>>> expr = "$.store.book[:2]"
>>> JsonPath(obj, expr).load()
[
{
'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
}
]
获取book数据中price小于10的所有数据:
>>> from pyjsonpath import JsonPath
>>> expr = "$.store.book[?(@.price < 10)]"
>>> JsonPath(obj, expr).load()
[
{
'category':'reference',
'author':'Nigel Rees',
'title':'Sayings of the Century',
'price':8.95
},
{
'category':'fiction',
'author':'Herman Melville',
'title':'Moby Dick',
'isbn':'0-553-21311-3',
'price':8.99
}
]
更多jsonpath语法请看jsonpath文档
pyjsonpath源码: https://github.com/hitplum/pyjsonpath