Python字典不是JSON:用json.dumps生成接口请求体
写接口测试脚本时,Python 字典看起来与 JSON 很像,但不能把 str(payload) 当成请求体。Python 的 True、None 与 JSON 的 true、null 写法不同,字符串的引号和转义也应交给序列化器处理。
最小做法:对象交给 json.dumps
下面的示例只使用标准库,不发送网络请求:
import json
payload = {"message": "云服务器", "enabled": True, "empty": None}
text = json.dumps(payload, ensure_ascii=False, indent=2, allow_nan=False)
assert json.loads(text) == payload
print(text)
输出中的中文保持可读,布尔值为 true,空值为 null。不要用“把单引号替换成双引号”修补 str(dict),因为字符串本身也可能含引号、反斜杠或换行。
三个参数分别管什么
ensure_ascii=False 让非 ASCII 字符以可读形式输出,但必要的引号、反斜杠和控制字符仍会转义;indent=2 只控制排版;allow_nan=False 会拒绝 NaN、Infinity 等非 JSON 数值,抛出 ValueError,便于在发送前发现问题。ensure_ascii 不是 HTTP 的字符集配置,后续传输仍需使用接口要求的编码。
用往返验证检查示例
我已运行五类数据的 dumps/loads 往返断言:中文、布尔与空值、包含换行的字符串、包含双引号和反斜杠的字符串、列表,均通过。另外验证了 allow_nan=False 会拒绝 NaN,以及包含 True、None 的 str(dict) 不能被 json.loads 当作合法 JSON 解析。
往返相等只针对这里的字符串键和 JSON 可表达的数据,不是所有 Python 对象都能无损往返。例如非字符串字典键、元组、自定义对象,需要另外设计序列化规则。
接入请求库前再确认一项
有些 HTTP 库的 JSON 参数接收 Python 对象并自行序列化;此时应传原对象,避免把已经 dumps 的字符串再作为 JSON 对象参数,造成二次编码。若选择直接发送 text,则按所用库文档设置请求体和 Content-Type。本文没有实际调用云接口。
参考资料:Python 官方文档 json 模块的 dumps、loads 与类型转换说明;RFC 8259 的 JSON 字符串、字面量和数字语法。代码与验证用例为独立编写。
- 点赞
- 收藏
- 关注作者
评论(0)