做自动化测试的过程中,如果返回的json层级较多,取值会相对来说比较麻烦,经常使用的取值方式就是:

1.按照固定的层级,一级一级的进行查找

2.使用正则表达式

3.也可以使用jsonpath进行查找----相对来说比较方便的一种方式

 

jsonpath详细解说:

1.首先安装jsonpath依赖包-------pip install jsonpath

2.jsonpath 表达式讲解

xpath

jsonpath

描述

/

$

根节点

.

@

现行节点

/

.或者[]

取子节点

..

n/a

取父节点(jsonpath不支持)

//

..

相对节点,不管位置,选择所有符合条件的条件

*

*

匹配所有元素节点

[]

[]

迭代器标示(可以在里面做简单的迭代操作,如,数组下标、根据内容选值)

&#124

[,]

支持迭代器中做多选

[]

?()

支持过滤操作

n/a

()

支持表达式操作

()

n/a

分组,jsonpath不支持

 

 

 

 

 

 

 

 

 

 

 

 

 

 

使用方法:

$ 符,是查找的根节点,传入的参数是Python的dict类型,如果查到对应的结果,则返回为list结果,如果未查找到对应的结果,返回False

$.是取子节点,如果不在当前节点,可以使用 $.. 相对节点取值,取出所有满足要求的子孙节点

实践方法如下:

import jsonpath

result = {
    "code": 0,
    "data": [
        {
            "age": 20,
            "create_time": "2020-12-12",
            "id": 1,
            "mail": "7048667795@qq.com",
            "name": "mini",
            "sex": "W"
        },
        {
            "age": 21,
            "create_time": "2019-12-16",
            "id": 2,
            "mail": "23233232323@qq.com",
            "name": "mini12",
            "sex": "M"
        }
    ],
    "msg": "success!"
}


#$.  -->表示的意思:根节点下的子节点msg,所以输出结果为:success!
msg = jsonpath.jsonpath(result, '$.msg')
print(msg)   # 输出结果 ['success!']
#$..  -->表示的意思:根节点下的相对节点(也就是不管位置,选择所有符合条件的条件)-->输出结果是以列表的形式进行存储
names = jsonpath.jsonpath(result, '$..name')
print(names)   # 输出结果 ['mini', 'mini12']
#$..  -->表示的意思:根节点下的相对节点(也就是不管位置,选择所有符合条件的条件)-->如果未查找到相关的内容,则会返回False
no = jsonpath.jsonpath(result, '$..mini13')
print(no)   # 找不到是结果是 False

list列表取值

import jsonpath
rep={
    "code": 0,
    "msg": "success!",
    "data": [{
        "id": 154,
        "create_time": "2021-01-20 22:38:16",
        "update_time": "2021-01-20 22:38:16",
        "goodsname": "《selenium入门到精通到放弃》",
        "goodscode": "sp_210001",
        "merchantid": "",
        "merchantname": "",
        "goodsprice": 20.0,
        "stock": 0,
        "goodsgroupid": 0,
        "goodsstatus": 1
    }, {
        "id": 1,
        "create_time": "2021-01-17 15:14:25",
        "update_time": "2021-01-20 22:21:51",
        "goodsname": "《jmeter 入门到精通》",
        "goodscode": "sp_100049",
        "merchantid": "10001",
        "merchantname": "悠悠学堂",
        "goodsprice": 100.0,
        "stock": 1,
        "goodsgroupid": 1,
        "goodsstatus": 1
    }, {
        "id": 150,
        "create_time": "2021-01-19 23:43:47",
        "update_time": "2021-01-19 23:43:47",
        "goodsname": "《cypress 入门到精通》",
        "goodscode": "sp_10002232",
        "merchantid": "1000122",
        "merchantname": "悠悠学堂",
        "goodsprice": 49.9,
        "stock": 100,
        "goodsgroupid": 0,
        "goodsstatus": 1
    }, {
        "id": 148,
        "create_time": "2021-01-19 23:42:20",
        "update_time": "2021-01-19 23:42:20",
        "goodsname": "《appium 入门到精通》",
        "goodscode": "sp_426001",
        "merchantid": "42601",
        "merchantname": "悠悠学堂",
        "goodsprice": 99.9,
        "stock": 100,
        "goodsgroupid": 0,
        "goodsstatus": 1
    }, {
        "id": 147,
        "create_time": "2021-01-19 22:22:41",
        "update_time": "2021-01-19 22:22:41",
        "goodsname": "《pytest 入门到精通》",
        "goodscode": "sp_100119",
        "merchantid": "",
        "merchantname": "",
        "goodsprice": 10.0,
        "stock": 0,
        "goodsgroupid": 0,
        "goodsstatus": 1
    }]
}

1.根据下标,取出列表中的第一组值

data1=jsonpath.jsonpath(rep,'$.data[0]')
print(data0)

输出结果:
[{'id': 154, 'create_time': '2021-01-20 22:38:16', 'update_time': '2021-01-20 22:38:16', 'goodsname': '《selenium入门到精通到放弃》', 'goodscode': 'sp_210001', 'merchantid': '', 'merchantname': '', 'goodsprice': 0.0, 'stock': 0, 'goodsgroupid': 0, 'goodsstatus': 1}]

2.取出第一组数据里面的goodscode

goodscode_data2=jsonpath.jsonpath(rep,'$.data[0].goodscode')
print(goodscode)

输出结果:
['《selenium入门到精通到放弃》']

3.取出data里面的前三条条数据,可以使用list切片的方法进行取值

data_3=jsonpath.jsonpath(rep,'$.data[:3]')
print(data_03)

4.取出data里面的后两条数据,可以使用list切片的方式进行取值

data4=jsonpath.jsonpath(rep,'$.data[-2:]')
print(data-02)

5.取出data里面,倒数第二个数据,可以使用list切片进行取值   list[-2:-1]

data5=jsonpath.jsonpath(rep,'$.data[-2:-1]')
print(data4)

6.取出data里面,第一条和第三条数据,可以使用list切片进行取值  list[0,2]

data6=jsonpath.jsonpath(rep,'$.data[0,2]')
print(data5)

?()过滤器运算符

过滤器是用于筛选数组的逻辑表达式,一个典型的过滤器,[?(@.age>12)],其中@表示正在处理的当前项目

可以使用逻辑运算符,创建更复杂的过滤器,字符串文字必须用单引号或者双引号括起来

操作符

描述

==

等于(注意:1不等于'1')

!=

不等于

>

大于

>=

大于等于

<

小于

<=

小于等于

=~

匹配正则表达式[?(@.name=~/foo.*?/i)]

in

左边存在于右边[?(@.size in ['S','M'])]

nin

左边不存在于右边

size

长度(数组或字符串)

empty

为空(数组或字符串)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?()过滤表达式的使用

?()过滤表达式。表达式必须求值为一个布尔值,表达式一般结合@获取当前节点来过滤

1.找出商品价格大于30的全部商品信息

#价格大于30的
data1=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)]')
print(data1)

#价格大于30的goodscode
data2_goodscode=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodscode')
print(data2_goodscode)
输出结果:
['sp_100049', 'sp_10002232', 'sp_426001']

#价格大于30的goodsname
data3_goodsname=jsonpath.jsonpath(req,'$.data[?(@.goodsprice>30)].goodsname')
print(data3_goodsname)
输出结果:
['《jmeter 入门到精通》', '《cypress 入门到精通》', '《appium 入门到精通》']

2.取出 'goodscode': 'sp_100049' 对应的 goodsname

name=jsonpath.jsonpath(req,'$.data[?(@.goodscode == 'sp_100049')].goodsname')
print(name)
输出结果:
['《jmeter 入门到精通》']

3.取出 'goodscode': 'sp_100049' 和 'goodscode': 'sp_100119' 对应的 goodsname

#in 包含在内  nin不存在
name2=jsonpath.jsonpath(req,'$.data[?(@.goodscode in ["sp_100049", "sp_100119"])].goodsname')
print(name2)
输出结果:
['《jmeter 入门到精通》', '《pytest 入门到精通》']