前话:

学习是一生的事情,也是积少成多的事情,脚踏实地,一步一个脚印,或许暂时看不到其发挥作用,但是要相信总有一天会得到属于自己想要的一切。

dumps json python 转义单引号 python json转字典_字符串

最近在用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()方法,大家下来可以选择适合自己的方法。