jsonpath 的应用:
首先我们要知道,使用 jsonpath 之前我们要有一个对应的数据去进行对应的操作,比如我们工作中会得到的响应数据,基于我们的响应数据 我们要对应的提取 比如 token msg.....所以我们就会用到它 jsonpath。
那在Python 中 我们需要先按转第三方包 安装命令 pip install jsonpath
也可以点击直接安装
真是尴尬 安装失败了
为什么呢?我看了文档 一顿操作猛如虎 发现是 jsonpath 不兼容python 版本,我下载的 python 是3.12 版本不兼容,找了好多方法 累了。。。直接下载个低版本的 python 吧
然后执行命令pip install jsonpath
如果安装成功运行一段代码 返回北京就是正确的啦
import jsonpath
data = {
'name':'xiaowang',
'age':'28',
'city':'北京'
}
ret = jsonpath.jsonpath(data,'$.city')
print(ret)
那我们继续往下 刚才我输入了import jsonpath ,os快捷键进入 command+鼠标点击 jsonpath
我们可以看见是个 py 文件, 我们import jsonpath是导入我们的模块,我们需要通过这个模块来调用这个方法,我们调用方法是 jsonpath.jsonpath。
jsonpath.jsonpath(data,'$.city') data(需要提取的数据对象,提取的表达式)
提取的数据对象就是我们的响应数据,提取的表达式 jsonpath 是以$开始
那具体的表达式要怎么写呢 刚开始不熟悉的小伙伴可以用 json 解析器 会帮我自动生成 json 格式
重点⚠️ jsonpath 返回的数据都是列表格式
$:根节点 最外层的花括号
. :获取子节点
.. :获取所有符合条件的内容(不分层级)
我们现在知道最基本的 那就来试一下 没有数据的可以复制粘贴一下 json
{
"firstName": "John",
"lastName": "doe",
"age": 26,
"address": {
"streetAddress": "naist street",
"city": "Nara",
"postalCode": "630-0192"
},
"phoneNumbers": [{
"abc": "uuu",
"Code": "630-0292",
"type": "iPhone",
"number": "0123-4567-8888"
},
{
"type": "home",
"number": "0123-4567-8911"
},
{
"type1": "jia",
"number": "0123-4567-8912"
},
{
"type2": "jia22",
"number": "0123-4567-8913"
},
{
"type2": "jia33",
"number": "0123-4567-8914"
}
]
}
那如果两个 type 我们想获取第一个要怎么写呢 用下标的方法来获取 从 0 开始
* :获取所有的元素节点
[index] :通过下标来获取
[,] :表示多个结果的选择
[start:end] :指定范围内的元素 左闭右开 不包含 end 比如有 5 条数据我们[0:4] 就说明是从 0-3
?(@.a == b) 表示过滤操作 @代表当前节点
知道了 jsonpath 的基本运用 那我们就可一开始浅写一点代码啦
import jsonpath
data = {
"firstName": "John",
"lastName": "doe",
"age": 26,
"address": {
"streetAddress": "naist street",
"city": "Nara",
"postalCode": "630-0192"
},
"phoneNumbers": [{
"abc": "uuu",
"Code": "630-0292",
"type": "iPhone",
"number": "0123-4567-8888"
},
{
"type": "home",
"number": "0123-4567-8911"
},
{
"type1": "jia",
"number": "0123-4567-8912"
},
{
"type2": "jia22",
"number": "0123-4567-8913"
},
{
"type2": "jia33",
"number": "0123-4567-8914"
}
]
}
ret = jsonpath.jsonpath(data,'$.age')
print(ret)
结果也跟我们之前一样,看返回结果 还是那句话 返回数据一定是个列表!!!
ret = jsonpath.jsonpath(data,'$.phoneNumbers')
print(ret)
[[{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}, {'type': 'home', 'number': '0123-4567-8911'}, {'type1': 'jia', 'number': '0123-4567-8912'}, {'type2': 'jia22', 'number': '0123-4567-8913'}, {'type2': 'jia33', 'number': '0123-4567-8914'}]]
看!!前面是列表套列表 用我们学到的
ret = jsonpath.jsonpath(data,'$.phoneNumbers.*')
print(ret)
[{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}, {'type': 'home', 'number': '0123-4567-8911'}, {'type1': 'jia', 'number': '0123-4567-8912'}, {'type2': 'jia22', 'number': '0123-4567-8913'}, {'type2': 'jia33', 'number': '0123-4567-8914'}]
我们现在有 5 组数据 我们可以用下标索引的方式来看一下第一组和最后一组
print(ret[0])
print(ret[-1])
{'abc': 'uuu', 'Code': '630-0292', 'type': 'iPhone', 'number': '0123-4567-8888'}
{'type2': 'jia33', 'number': '0123-4567-8914'}
jsonpath 提取数据的场景
需要断言:看某个响应字段是不是我们想要的
接口关联:提取当前接口的响应数据,作为下一个接口的请求数据
我们先讲第一个 断言
断言的关键字是 assert
怎么用呢 举例:
assert表达式,当不满足条件的时候提示信息
assert 3 == 3,“两者之间不相等”
如果通过断言则正常运行没有提示,断言只有在条件不满足时才会提示信息
我们可以来简单运行一下代码,因为 1=1 所以不会出来提示信息
assert 1 == 1,'两者之间不相等'
那我们把 1 改成 2 在运行一下
assert 1 == 2,'两者之间不相等'
断言也可以不是== 也可以是> 或者< 逻辑运算符都可以进行运用
那我们现在知道了 post 请求 知道了 jsonpath 知道了断言 那我们来代码写一写
先登录接口 拿到返回数据 msg
在对 msg 来进行断言
import requests
import json
import jsonpath
url = "http://www.baidu.com/php?s=/login"
yu_pramas = {
"application": "app",
"application_client_type": "weixin"
}
data = {
'accounts': 'nihao',
'pwd': '123ujgh',
'type': 'username'
}
header = {
'Content-Type': 'application/json'
}
new_data = json.dumps(data)
ret = requests.post(url, params=yu_pramas, data=new_data, headers=header)
print(ret.text)
mag_ret = jsonpath.jsonpath(ret.json() ,'$.msg')
print("当前提取的数据为:",mag_ret)
assert mag_ret == "登录成功",f"错误,我们当前返回的值是:{mag_ret}"
看运行结果
这时候我们看 当前提取的数据为: ['登录成功']
这是个列表啊 我们用下标索引的方法来取一下值
mag_ret = jsonpath.jsonpath(ret.json() ,'$.msg')[0]
那我们下来跑一下看结果
如果我们改一下密码再看一下
断言就说到这里啦
标签:0123,Python,number,接口,Jsonpath,4567,ret,data,jsonpath From: https://blog.csdn.net/weixin_46096113/article/details/143800370