【python】str与json类型转换

在写接口测试框架时,避免不了数据类型的转换,比如强制转换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可以把listtupledictstring相互转化

  • 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进行处理


欢迎关注个人公众号
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sysu_lluozh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值