【python接口自动化】- 使用json及jsonpath转换和提取数据

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

前言

​ JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它可以让人们很容易的进行阅读和编写,同时也方便了机器进行解析和生成,适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。简单说就是javascript中的对象和数组,通过这两种结构可以表示各种复杂的结构。

​ 📝对象:对象在js中是花括号{}括起来的内容,数据结构为{key:value,key:value,...}这样的键值对结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key来获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。

​ 📝数组:数组在js中是中括号[]括起来的内容,数据结构为["Python", "javascript", "C++",..],类似python中的列表,取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。

json模块

​ 在之前的request库介绍中就提到过,现在99%的接口返回的数据都是json格式,在python中,有专门处理json格式的模块——json模块,在python2.6之后的版本都自带了这一个模块,直接导入import json即可。json模块提供了四个功能:dumpsloadsdumpload,用于字符串和python数据类型之间进行转换。

  • json.dumps():将 Python 对象解码转换成 JSON 字符串
  • json.loads():把JSON 格式字符串解码转换成Python 对象
  • json.dump():将Python内置类型序列化为JSON 对象后写入文件
  • json.load():读取文件中JSON 形式的字符串元素转化成Python 类型

​ 其中类文件对象的理解,其实就是具有read()或者write()方法的对象,比如f = open("test.txt","r") f就是类文件对象。下面对dumpsloads分别举例说明:

python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#f92672">import</span> json

data = [{<span style="color:#98c379">'a'</span>: <span style="color:#d19a66">1</span>, <span style="color:#98c379">'b'</span>: <span style="color:#d19a66">2</span>, <span style="color:#98c379">'c'</span>: <span style="color:#d19a66">3</span>}]
data2 = json.dumps(data)  <span style="color:#b18eb1"><em># 将python对象转换成json字符串</em></span>
<span style="color:#e6c07b">print</span>(data2)
<span style="color:#e6c07b">print</span>(<span style="color:#e6c07b">type</span>(data2))
<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"-------还可以使用参数格式化输出json格式--------"</span>)
<span style="color:#e6c07b">print</span>(json.dumps(data, sort_keys=<span style="color:#56b6c2">True</span>, indent=<span style="color:#d19a66">4</span>, separators=(<span style="color:#98c379">','</span>, <span style="color:#98c379">': '</span>)))

jsonData = <span style="color:#98c379">'{"a":1,"b":2,"c":3,"d":4,"e":5}'</span>
text = json.loads(jsonData)
<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"---------json转python---------"</span>)
<span style="color:#e6c07b">print</span>(text)
<span style="color:#e6c07b">print</span>(<span style="color:#e6c07b">type</span>(jsonData))

<span style="color:#b18eb1"><em># 返回结果如下:</em></span>
<span style="color:#b18eb1"><em># C:\software\python\python.exe D:/learn/test.py</em></span>
<span style="color:#b18eb1"><em># [{"a": 1, "b": 2, "c": 3}]</em></span>
<span style="color:#b18eb1"><em># <class 'str'></em></span>
<span style="color:#b18eb1"><em># -------还可以使用参数格式化输出json格式--------</em></span>
<span style="color:#b18eb1"><em># [</em></span>
<span style="color:#b18eb1"><em>#     {</em></span>
<span style="color:#b18eb1"><em>#         "a": 1,</em></span>
<span style="color:#b18eb1"><em>#         "b": 2,</em></span>
<span style="color:#b18eb1"><em>#         "c": 3</em></span>
<span style="color:#b18eb1"><em>#     }</em></span>
<span style="color:#b18eb1"><em># ]</em></span>
<span style="color:#b18eb1"><em># ---------json转python---------</em></span>
<span style="color:#b18eb1"><em># {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}</em></span>
<span style="color:#b18eb1"><em># <class 'str'></em></span>
<span style="color:#b18eb1"><em># </em></span>
<span style="color:#b18eb1"><em># Process finished with exit code 0</em></span></span></span>

​ dumps解码的过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumpsdump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串。

​ 解码中常用的参数

  • Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型,设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
  • ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
  • indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
  • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',','😂;这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开
  • encoding:默认是UTF-8,设置json数据的编码方式
  • sort_keys:将数据根据keys的值进行排序。

​ python 类型向 json 类型的转化对照表如下:

PythonJSON
dictobject(对象)
list, tuplearray(数组)
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

​ 反之,json 类型转换到 python 的类型对照表:

JSONPython
object(对象)dict
array(数组)list
stringunicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone

​ 🚩特别注意:转换的时候,python的None会变成nullTrueFalse转换后首字母都会变成小写噢!他们的json格式在python中是无法被识别的,会被当成变量处理。

​ 更多的相关内容,可以查阅python的官方文档:18.2. json — JSON encoder and decoder — Python 2.7.18 documentation

jsonpath库

​ JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括JavaScript、Python、PHP和Java。JsonPath对于JSON来说,就相当于XPATH对于XML。JsonPath结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

XpathJSONPath描述
/$根节点
.@现行节点
/. or []取子节点
..n/a取父节点,Jsonpath未支持
//..不管位置,选择所有符合条件的节点
**匹配所有元素节点
@n/a根据属性访问,JsonPath不支持
[][]迭代器(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
|[,]支持迭代器中做多选
[]?()支持过滤操作
n/a()支持表达式计算
()n/a分组,JsonPath不支持
  • pip安装pip install jsonpath,官网文档:JSONPath - XPath for JSON
  • 使用方法jsonpath.jsonpath(),结果会以列表形式返回,如下请求接口返回数据提取例子
    • 🍊参数1:数据对象
    • 🍎参数2:jsonpath表达式
python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#f92672">import</span> requests
<span style="color:#f92672">import</span> jsonpath

login_url = <span style="color:#98c379">"http://localhost:8080/member/login"</span>
login_data = {
    <span style="color:#98c379">"mobile_phone"</span>: <span style="color:#98c379">"15867554893"</span>,
    <span style="color:#98c379">"pwd"</span>: <span style="color:#98c379">"123456qwe"</span>,
}
header = {    <span style="color:#98c379">"Content-Type"</span>: <span style="color:#98c379">"application/json"</span>}
<span style="color:#b18eb1"><em># 发送登录的请求</em></span>
response = requests.post(url=login_url, json=login_data, headers=header)
<span style="color:#b18eb1"><em># 获取返回的json数据</em></span>
json_data = response.json()


member_id = jsonpath.jsonpath(json_data, <span style="color:#98c379">"$..id"</span>)[<span style="color:#d19a66">0</span>]
type_token = jsonpath.jsonpath(json_data, <span style="color:#98c379">"$..token_type"</span>)[<span style="color:#d19a66">0</span>]
token = jsonpath.jsonpath(json_data, <span style="color:#98c379">"$..token"</span>)[<span style="color:#d19a66">0</span>]
<span style="color:#e6c07b">print</span>(json_data)
<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"会员id:{}"</span>.<span style="color:#e6c07b">format</span>(member_id))
<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"token的类型:{}"</span>.<span style="color:#e6c07b">format</span>(type_token))
<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"token:{}"</span>.<span style="color:#e6c07b">format</span>(token))</span></span>

​ 运行返回的数据如下:

shell
<span style="background-color:#282c34"><span style="color:#abb2bf">C:\software\python\python.exe D:/learn/test.py
{'code': 0, 'msg': 'OK', 'data': {'id': 59514, 'money': 34000.0, 'mobile_phone': '15612345678', 'reg_name': 'miki测试', 'reg_time': '2020-11-16 22:18:59.0', 'type': 0, 'token_info': {'token_type': 'Bearer', 'expires_in': '2020-12-10 00:30:01', 'token': 'eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjU5NTE0LCJleHAiOjE2MDc1MzE0MDF9.GAoCY5RZ_FWUIRMNXdURdH5y7zKuETo1qsq9Z9No9AaWvo2QGLR9maWxEY31Ddy6a7QmpT56xKg7N3YwGLTbOQ'}}}
会员id:59514
token的类型:Bearer
token:eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjU5NTE0LCJleHAiOjE2MDc1MzE0MDF9.GAoCY5RZ_FWUIRMNXdURdH5y7zKuETo1qsq9Z9No9AaWvo2QGLR9maWxEY31Ddy6a7QmpT56xKg7N3YwGLTbOQ</span></span>

​ 登录接口返回的json数据格式化后的层级显示如下:

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python接口自动化中,POST请求是常见的一种请求方式。POST请求通常用于向服务器提交数据,比如表单数据JSON数据等。在Python中,我们可以使用requests库来发送POST请求。具体步骤如下: 1. 导入requests库 ``` import requests ``` 2. 构造请求参数 POST请求通常需要传递一些参数,比如表单数据JSON数据等。我们可以使用字典来构造请求参数。 ``` data = { 'username': 'admin', 'password': '123456' } ``` 3. 发送POST请求 使用requests库的post方法来发送POST请求,传递请求的URL和请求参数即可。 ``` url = 'http://www.example.com/login' response = requests.post(url, data=data) ``` 4. 处理响应结果 发送POST请求后,服务器会返回响应结果。我们可以通过response对象来获取响应结果。 ``` print(response.status_code) # 获取响应状态码 print(response.text) # 获取响应内容 ``` 以上就是Python接口自动化中发送POST请求的基本步骤。 ### 回答2: Python接口自动化中,Post请求是常用的一种请求方式,通常用于向服务器提交数据。Post请求与Get请求不同,它将请求参数放在请求体中,而不是放在URL的参数中。 在Python中,可以使用requests库来发送Post请求,其基本用法示例如下: ``` import requests # 构造请求参数 url = "http://www.example.com/api" data = { "username": "xxx", "password": "xxx" } # 发送Post请求 response = requests.post(url, data=data) # 解析响应数据 result = response.json() ``` 以上示例中,首先构造了请求参数,包括请求URL和请求数据。然后使用requests库发送Post请求,其中url参数传入请求URL,data参数传入请求数据。发送请求后,可以通过response.json()方法将响应数据解析为JSON格式的数据,方便后续操作。 在实际使用中,请求参数的构造可能更加复杂,包括请求头、cookies等,可以通过requests库提供的各种方法进行设置。另外,在接口自动化中,需要进行接口测试的时候,通常需要用到断言,可以使用Python自带的assert语句或其他第三方断言库来进行断言操作。 总之,在Python接口自动化中,Post请求是常见的请求方式,使用requests库可以轻松实现Post请求的发送和响应解析,同时也可以进行断言操作,方便进行接口测试。 ### 回答3: Python接口自动化中,使用POST请求是非常常见的操作。POST请求是HTTP协议中的一种请求方式,主要用于向服务器提交数据。相较于GET请求,POST请求通常用于提交表单数据、上传文件和请求创建新资源等场景。 下面我们来介绍Python中如何实现POST请求的操作。 首先需要导入requests库: ```python import requests ``` 接下来,我们可以定义一个POST请求的函数,传入URL、参数和请求头部(可选): ```python def post_request(url, data, headers=None): """ POST请求 """ response = requests.post(url=url, data=data, headers=headers) # 返回响应结果 return response ``` 以上代码中,我们使用requests.post()方法发送POST请求,传入URL、参数和请求头部。其中,URL表示请求的URL地址,data表示请求的数据,headers表示请求头部,可选。 接着,我们可以通过调用上面定义的函数,发送POST请求并获取响应结果: ```python url = "http://example.com/api/login" data = { "username": "testuser", "password": "testpass" } headers = { "User-Agent": "Mozilla/5.0" } # 发送POST请求 response = post_request(url=url, data=data, headers=headers) # 输出响应结果 print(response.text) ``` 以上代码中,我们定义了一个POST请求的URL地址和请求数据,以及一个请求头部(User-Agent)。然后,我们调用post_request()函数,传入URL、数据和请求头,发送POST请求并获取响应结果。最后,我们输出响应结果的文本内容。 除了以上的方式,我们还可以通过requests库的其他方法实现POST请求,如下所示: ```python # 使用JSON格式数据发送POST请求 response = requests.post(url=url, json=data, headers=headers) # 使用文件上传方式发送POST请求 files = {'file': open('file.png', 'rb')} response = requests.post(url=url, files=files, headers=headers) ``` 以上代码分别演示了通过JSON格式数据和文件上传方式发送POST请求的方法。 总的来说,Python实现接口自动化中的POST请求操作,其实就是通过requests库提供的post()方法或其他方法,传入请求的URL、数据和请求头部,即可实现。同时,需要注意请求参数的格式和请求头部的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值