python 中 jsonpath 模块的运用

发布于 更新于

技术文章测试开发

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

  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}")

来源:testingpai

继续阅读