前话:
学习是一生的事情,也是积少成多的事情,脚踏实地,一步一个脚印,或许暂时看不到其发挥作用,但是要相信总有一天会得到属于自己想要的一切。
最近在用python写接口自动化用例的时候,发现有两个知识点用的很多的地方,而且需要注意的地方,这里我进行介绍下,希望可以给大家提供一个解决方法。
json字符串如何转换为字典格式
首先如果要json字符串可以转换为字典格式,这个字符串首先需要基本满足json的格式,即"key":value的形式,且左右两边需要分别用'{}'封闭字符串。字符串转换为字典可以用json.loads()方法。
下面介绍大家容易出错的地方:
str1 = "{'code': '0000', 'data': {'id': 413}, 'msg': None}"
str2 = '{"code": "0000", "data": {"id": 413}, "msg": None}'
str3 = '{"code": "0000", "data": {"id": 413}, "msg": "None"}'
对上边三个字符串都执行相同的操作:
import json
str1_new = json.loads(str1)
str2_new = json.loads(str2)
str3_new = json.loads(str3)
print(str1_new)
print(type(str1_new))
……
大家可以自己在pycharm中试着运行下,会发现只有str3字符串运行结果是对的,其他两个运行结果都会报错。这里说明两地注意的地方:
(1)如果要让json字符串转换为dict类型,字符串中key的值需要用双引号括起来
(2)如果字符串中的value是一个字符串形式,如str2中的None,也需要用双引号括起来
(3)如果字符串中的value是一个数值的话可以不需要用双引号
字典格式如何转换为json字符串
字典转换为字符串,没有字符串转换为字典那么复杂,其用json.dumps()方法即可解决。如下:
dict2 = {"code": "0000", "data": {"id": 413}, "msg": "None"}dict2_new = json.dumps(dict2)print(dict2_new)print(type(dict2_new))
结果为:
{'code': '0000', 'data': {'id': 413}, 'msg': 'None'}
一个问题
下边我讲一下我在字符串转为字典过程中遇到的一个问题,我的一个json字符串很长,如下所示:
str1 = '{"code":"0000","data":[{"catalogId":0,"name":"自定义类型","level":"1","isLeaf":"1","subList":null},{"catalogId":1,"name":"工程机械","level":"1","isLeaf":"0","subList":[{"catalogId":2,"name":"基础施工机械","level":"2","isLeaf":"0","subList":[{"catalogId":3,"name":"旋挖钻","level":"3","isLeaf":"1","subList":null}]},...,"msg":null}'
可以看到这个json字符串很长很长,还有各种嵌套,然后对这个字符串进行转换为dict,大家看下运行的结果:
str1_new = json.loads(str1)
这么直接运算的话,结果也是OK的。但是当这串字符串是通过request请求返回的响应结果时,这么直接loads就会报错。代码大致如下:
info = RunMain().run_main(self.method, url1, data1, headers) # 根据Excel中的method调用run_main来进行requests请求,并拿到响应ss = json.loads(info) # 将响应转换为字典格式
从上边运行结果可以print(type(ss)),发现ss的类型为str,不是字典型。感到很纳闷,于是自己网上搜索了很多结果,发现需要在loads一遍,即ss = json.loads(ss),这时候得出的ss就是dict型。
所以大家在进行接口测试的时候,如果需要对请求的响应进行相应格式的转换,可以采用如下方法来进行一些简单的问题规避:
info = RunMain().run_main(self.method, url1, data1, headers) # 根据Excel中的method调用run_main来进行requests请求,并拿到响应ss = json.loads(info) # 将响应转换为字典格式print(type(ss))if not isinstance(ss, dict):ss = json.loads(ss)
如果是一次loads无法得到想要的结果,可以对第一次loads的结果进行一个类型的判断,如果非dict,再进行一次loads,一般两次loads都可以得到想要的结果。
最后
在实际的过程中可能还有很多方法进行字符串和字典的转换,如eval()方法,str()方法,大家下来可以选择适合自己的方法。