Python字典不是JSON:用json.dumps生成接口请求体

举报
yd_283252214 发表于 2026/10/20 09:14:55 2026/10/20
【摘要】 用Python标准库json.dumps正确生成包含中文、布尔值与空值的JSON,验证转义与往返解析,并说明str(dict)、二次序列化和特殊数值的常见问题。

写接口测试脚本时,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 字符串、字面量和数字语法。代码与验证用例为独立编写。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。