在写接口测试框架时,避免不了数据类型的转换,比如强制转换string类型,比如转json类型
一、str转json
str转为json格式,一定需要保证这个str的格式是json string
1.1 使用json.loads
字符串str转json对象,需要使用json模块的loads函数
import json
str1 = '{"accessToken": "521de21161b23988173e6f7f48f9ee96e28", "User-Agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_131)"}'
json1 = json.loads(str1)
print(json1)
print(type(json1))
# 输出
{'accessToken': '521de21161b23988173e6f7f48f9ee96e28', 'User-Agent': 'Apache-HttpClient/4.5.2 (Java/1.8.0_131)'}
<class 'dict'>
1.2 使用eval
eval的作用:将字符串str当成有效的表达式来求值并返回计算结果
即可以通过eval
可以把list
、tuple
、dict
和string
相互转化
- list
str1 = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
json1 = eval(str1)
print(type(json1))
print(json1)
# 输出
<class 'list'>
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
- tuple
str1 = "([1,2], [3,4], [5,6], [7,8], (9,0))"
json1 = eval(str1)
print(type(json1))
print(json1)
# 输出
<class 'tuple'>
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
- dict
str1 = "{'a': 1, 'b': 2}"
json1 = eval(str1)
print(type(json1))
print(json1)
# 输出
<class 'dict'>
{'a': 1, 'b': 2}
注意:
eval()可以通过运行系统的命令
比如:eval(“import(‘os’).startfile(‘notepad.exe’)”) #启动记事本程序
为了保证安全,当需要用户输入时,需要对用户的输入内容进行敏感字符检查和过滤
1.3 使用literal_eval
和eval使用方式相同,都可以将字符串str解析成list、tuple或dict,并且避免eval安全性的问题
import ast
str1 = "{'a': 1, 'b': 2}"
json1 = ast.literal_eval(str1)
print(type(json1))
print(json1)
# 输出
<class 'dict'>
{'a': 1, 'b': 2}
二、json转str
2.1 使用json.dumps
import json
json1 = {"accessToken": "521de21161b23988173e6f7f48f9ee96e28", "User-Agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_131)"}
str1 = json.dumps(json1)
print(str1)
print(type(str1))
# 输出
{"accessToken": "521de21161b23988173e6f7f48f9ee96e28", "User-Agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_131)"}
<class 'str'>
- 参数补充
json.dumps提供了一些参数,可以对转换的字符串进行特殊的处理
import json
json1 = {"accessToken": "521de21161b23988173e6f7f48f9ee96e28", "User-Agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_131)"}
str1 = json.dumps(json1, sort_keys=True, indent=4, separators=(',', ':'))
str2 = json.dumps(json1)
'''
我们来对这几个参数进行下解释:
sort_keys:是否按照字典排序(a-z)输出,True代表是,False代表否。
indent=4:设置缩进格数,一般由于Linux的习惯,这里会设置为4。
separators:设置分隔符,在dic = {'a': 1, 'b': 2, 'c': 3}这行代码里可以看到冒号和逗号后面都带了个空格,这也是因为Python的默认格式也是如此,
如果不想后面带有空格输出,那就可以设置成separators=(',', ':'),如果想保持原样,可以写成separators=(', ', ': ')。
'''
2.1 使用str
可以使用强制类型转换将json格式转成str格式
json1 = {'name':'洛','age':'22'}
str1 = json.dumps(json1)
print(str1)
print(type(str1))
# 输出
{'name': '洛', 'age': '22'}
<class 'str'>
三、踩坑问题
写这篇文章主要是为了mark一个问题,在str转json时,str格式引号问题导致失败报错
看看下面这段代码
import json
str1 = "{'accessToken': '521de21161b23988173e6f7f48f9ee96e28', 'User-Agent': 'Apache-HttpClient/4.5.2 (Java/1.8.0_131)'}"
json1 = json.loads(str)
print(json1)
print(type(json1))
咋一看没啥问题,但是出现错误
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
为什么呢?
字符串中,双引号在外围,单引号在内嵌,导致转换失败,可以使用json5
进行处理
欢迎关注个人公众号