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
}
jsonpath语法
常规操作符
操作符 | 描述 |
---|
$ | 查询根元素 | @ | 过滤正在处理的当前节点 | * | 通配符。可在任何需要名称或数字的地方使用 | … | 深层扫描,在任何需要名称的地方使用 | .<name> | 获取子节点 | [’<name>’ (, ‘<name>’)] | 获取一个或多个子节点 | [<number> (, <number>)] | 获取一个或多个数组下标索引 | [start:end] | 切片数组运算符 | [?(<expression>)] | 过滤表达式。表达式必须计算为布尔值 |
函数
函数 | 描述 |
---|
min() | 获取数字数组的最小值 | max() | 获取数字数组的最大值 | avg() | 获取数字数组的平均值 | stddev() | 获取数字数组的标准差值 | length() | 获取数组的长度 | sum() | 获取数字数组的和 | keys() | 获取字典的键 |
过滤操作符
操作符 | 描述 |
---|
== | 左边等于右边,注意: 1不等于’1’ | != | 左边不等于右边 | < | 左边小于右边 | <= | 左边小于等于右边 | > | 左边大于右边 | >= | 左边大于等于右边 | =~ | 左边匹配正则表达式 | in | 左边存在于右边 | nin | 左边不存在于右边 | subsetof | 左边是右边的子集 | anyof | 左边与右边有交集 | noneof | 左边与右边没有交集 | size | 左边(数组或字符串)的大小应与右边匹配 | empty | 左(数组或字符串)应该是空的 |
pyjsonpath
安装
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
|