python 中 jsonpath 模块的运用

  1. jsonpath 介绍
    用来解析多层嵌套的 JSON 数据;JsonPath 是一种信息抽取类库,是从 JSON 文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

使用方法如:

import jsonpath
res=jsonpath.jsonpath(dic_name,'..key_name') #嵌套n层也能取到所有key_name信息,其中:“”表示最外层的{},“..”表示模糊匹配,当传入不存在的 key_name 时,程序会返回 false

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

    安装方法:pip install jsonpath

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

    1. JsonPath 与 XPath 语法对比:
      JSON 结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了 XPath 的用法。
Xpath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ . or [] 取子节点
.. n/a 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
[] [] 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)
&#124 [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组,JsonPath 不支持
  1. 使用实例:返回结果是 list(列表)格式
from jsonpath import jsonpath



dict ={
    "lemon": {
        "teachers": [
            {
                "id": "101",
                "name": "华华",
                "addr": "湖南长沙",
                "age": 25
            },
             {
                "id": "102",
                "name": "韬哥",
                "age": 28
            },
            {
                "id": "103",
                "name": "Happy",
                # "addr": "广东深圳",
                "age": 16
            },
             {
                "id": "104",
                "name": "歪歪",
                "addr": "广东广州",
                "age": 29
            }
        ],
        "salesmans": [
            {
                "id": "105",
                "name": "毛毛",
                "age": 17
            },
             {
                "id": "106",
                "name": "大树",
                "age": 27
            }
        ]
    },
 "avg": 25
}

# 获取所有老师的的名称,返回结果为列表,列表值为字典
# teachers = jsonpath(dict,"$.lemon.teachers[*].name")
teachers = jsonpath(dict,"$..teachers[*].name")
print(f"获取所有老师的的名称{teachers}")

# 获取所有人的名称
names = jsonpath(dict,"$..name")
print(f"获取所有人的名称{names}")

# 所有的老师和销售
# man = jsonpath(dict,"$.[*]")
man = jsonpath(dict,"$.lemon.*")
print(f"所有的老师和销售{man}")


# 所有人的年龄
# ages = jsonpath(dict,"$..age")
ages = jsonpath(dict,"$.lemon..age")
print(f"所有人的年龄{ages}")

# 所有老师的年龄
tea_ages = jsonpath(dict,"$..teachers[*].age")
print(f"所有老师的年龄{tea_ages}")

# 索引为 3(第 4 个)老师的信息
tea3 = jsonpath(dict,"$..teachers[3]")
print(f"索引为 3(第 4 个)老师的信息{tea3}")

# 倒数第 2 个老师的信息----有问题
tea2 = jsonpath(dict,"$..teachers[-2]")
print(f"倒数第 2 个老师的信息{tea2}")

# 索引 0(包含)到索引 2(不包含)的老师信息
tea = jsonpath(dict,"$..teachers[0:2]")
print(f"索引 0(包含)到索引 2(不包含)的老师信息{tea}")

# 所有包含地址的老师信息(jsonpath_rw 不支持)
has_add = jsonpath(dict,"$..teachers[?(@.addr)]")
# has_add = jsonpath(dict,"$..teachers[?(@.addr)]")

print(f"所有包含地址的老师信息(jsonpath_rw 不支持){has_add}")

1 操作
huangxy 在 2021-02-19 09:13:57 更新了该帖
回帖
请输入回帖内容 ...