一 前言
JSON(JavaScript Object Notatio):JavaScript对象表示法。json是轻量级的文本数据交换格式。在http请求与http响应中广泛存在,用来实现前后端数据的交换。本篇介绍一个json格式的python数据读取后作为API入参解析失败的案例。
二 问题描述
常见场景:API请求返回的json字符串转换成Python可识别的字典并方便读取,Python字典字符串转换成json字符串作为API请求的入参。
import json
# 包含斜杠的JSON字符串
data = "{\"first\":\"{\\\"name\\\": \\\"SSSK001\\\",\\\"attr_type\\\": 1,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小红\\\\\\\",\\\\\\\"weight\\\\\\\": 5}, {\\\\\\\"name\\\\\\\": \\\\\\\"小蓝\\\\\\\",\\\\\\\"weight\\\\\\\": 5}]}\",\"second\":\"{\\\"name\\\": \\\"SSSK002\\\",\\\"attr_type\\\": 2,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小黑\\\\\\\",\\\\\\\"weight\\\\\\\": 8}]}\"}"
# 将JSON字符串转换为Python对象
data = json.loads(data)
print(data)
# 输出:
# {'first': '{"name": "SSSK001","attr_type": 1,"sub_attributes": [{\\"name\\": \\"小红\\",\\"weight\\": 5}, {\\"name\\": \\"小蓝\\",\\"weight\\": 5}]}', 'second': '{"name": "SSSK002","attr_type": 2,"sub_attributes": [{\\"name\\": \\"小黑\\",\\"weight\\": 8}]}'}
上述代码通过loads函数直接读取data数据时,输出并不是标准的json数据,作为API请求的入参,出现参数解析错误。
三 解决方法
使用dumps函数。dumps是 dump string
的缩写。dumps函数用于将Python对象序列化为JSON字符串。这里可以用dumps函数将data数据序列化为JSON字符串。
import json
# 准备符合格式json格式要求的python数据
data = "{\"first\":\"{\\\"name\\\": \\\"SSSK001\\\",\\\"attr_type\\\": 1,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小红\\\\\\\",\\\\\\\"weight\\\\\\\": 5}, {\\\\\\\"name\\\\\\\": \\\\\\\"小蓝\\\\\\\",\\\\\\\"weight\\\\\\\": 5}]}\",\"second\":\"{\\\"name\\\": \\\"SSSK002\\\",\\\"attr_type\\\": 2,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小黑\\\\\\\",\\\\\\\"weight\\\\\\\": 8}]}\"}"
#通过json.dumps(data)方法把python数据转化为了json数据
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
#通过json.loads(data)方法把json数据转化为了Python数据
data = json.loads(json_str)
print(data)
# 输出:
# "{\"first\":\"{\\\"name\\\": \\\"SSSK001\\\",\\\"attr_type\\\": 1,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小红\\\\\\\",\\\\\\\"weight\\\\\\\": 5}, {\\\\\\\"name\\\\\\\": \\\\\\\"小蓝\\\\\\\",\\\\\\\"weight\\\\\\\": 5}]}\",\"second\":\"{\\\"name\\\": \\\"SSSK002\\\",\\\"attr_type\\\": 2,\\\"sub_attributes\\\": [{\\\\\\\"name\\\\\\\": \\\\\\\"小黑\\\\\\\",\\\\\\\"weight\\\\\\\": 8}]}\"}"
# {"first":"{\"name\": \"SSSK001\",\"attr_type\": 1,\"sub_attributes\": [{\\\"name\\\": \\\"小红\\\",\\\"weight\\\": 5}, {\\\"name\\\": \\\"小蓝\\\",\\\"weight\\\": 5}]}","second":"{\"name\": \"SSSK002\",\"attr_type\": 2,\"sub_attributes\": [{\\\"name\\\": \\\"小黑\\\",\\\"weight\\\": 8}]}"}