python-jsonpath解析

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语法

常规操作符

操作符 描述
$ 查询根元素
@ 过滤正在处理的当前节点
* 通配符。可在任何需要名称或数字的地方使用
深层扫描,在任何需要名称的地方使用
. 获取子节点
[’’ (, ‘’)] 获取一个或多个子节点
[ (, )] 获取一个或多个数组下标索引
[start:end] 切片数组运算符
[?()] 过滤表达式。表达式必须计算为布尔值

函数

函数 描述
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

你可能感兴趣的:(python,python,jsonpath,pyjsonpath,json)