python之jsonpath模块用法分析

前言

JsonPath是一种信息抽取类库用来解析多层嵌套的json数据,是从JSON文档中抽取指定信息的工具,提供多种原因实现保本:JavaScript/Python/PHP和Java。

JsonPath 对于 JSON 来说,相当于 XPath 对于 XML。

安装

pip install jsonpath

官方文档:http://goessner.net/articles/JsonPath

使用方法

import jsonpath

res=jsonpath.jsonpath(dic_name,'$..key_name') 

详细解释:

参数dic_name的数据类型是python字典类型。

② '$..key_name'表达式:表示取到所有键为key_name的value。其中:“$”表示最外层的{},“..”表示模糊匹配

当传入不存在数据的表达式时,函数返回False布尔值

返回值的数据类型为python列表

JsonPath与XPath语法对比

Json结构清晰,可读性高,复杂度低,非常容易匹配;

下表中对应了XPath的用法:

XPathJSONPath描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
@ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

jsonpath表达式示例

实例

实例1

d = {
    "error_code": 0,
    "stu_info": [
        {
            "id": 2059,
            "name": "小白",
            "sex": "",
            "age": 28,
            "addr": "河南省济源市北海大道32号",
            "grade": "天蝎座",
            "phone": "18378309272",
            "gold": 10896,
            "info": {
                "card": 434345432,
                "bank_name": '中国银行'
            }

        },
        {
            "id": 2067,
            "name": "小黑",
            "sex": "",
            "age": 28,
            "addr": "河南省济源市北海大道32号",
            "grade": "天蝎座",
            "phone": "12345678915",
            "gold": 100
        }
    ]
}

res = d["stu_info"][1]['name']  # 取某个学生姓名的原始方法:通过查找字典中的key以及list方法中的下标索引
print(res)  # 输出结果是:小黑

import jsonpath

res1 = jsonpath.jsonpath(d, '$..name')  # 嵌套n层也能取到所有学生姓名信息,$表示最外层的{},..表示模糊匹配
print(res1)  # 输出结果是list:['小白', '小黑']

res2 = jsonpath.jsonpath(d, '$..bank_name')
print(res2)  # 输出结果是list:['中国银行']

res3 = jsonpath.jsonpath(d, '$..name123')  # 当传入不存在的key(name)时,返回False
print(res3)  # 输出结果是:False

实例2

import jsonpath

d = {
    "error_code": 0,
    "stu_info": [
        {
            "id": 314,
            "name": "矿泉水",
            "sex": "",
            "age": 18,
            "addr": "北京市昌平区",
            "grade": "摩羯座",
            "phone": "18317155663",
            "gold": 100,
            "cars": [
                {"car1": "bmw"},
                {"car2": "ben-z"},
            ]
        }
    ]

}
result = jsonpath.jsonpath(d, '$..car2')  # 模糊匹配
result1 = jsonpath.jsonpath(d, '$.stu_info')  # 取到stu_info这里的所有内容
result2 = jsonpath.jsonpath(d, '$.stu_info[0]')  # 取到stu_info里的第1个元素
result3 = jsonpath.jsonpath(d, '$.stu_info[0].id')  # 取到stu_info里的第1个元素中的id
print(result)
print(result1)
print(result2)
print(result3)

运行结果:

['ben-z']
[[{'id': 314, 'name': '矿泉水', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '摩羯座', 'phone': '18317155663', 'gold': 100, 'cars': [{'car1': 'bmw'}, {'car2': 'ben-z'}]}]]
[{'id': 314, 'name': '矿泉水', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '摩羯座', 'phone': '18317155663', 'gold': 100, 'cars': [{'car1': 'bmw'}, {'car2': 'ben-z'}]}]
[314]
posted @ 2021-07-09 21:06  习久性成  阅读(651)  评论(0编辑  收藏  举报