如何使用Python的json.dumps函数将复杂字典对象有效转换为标准字符串流?
- 内容介绍
- 文章标签
- 相关推荐
本文共计727个文字,预计阅读时间需要3分钟。
在Python中,`json.dumps()`函数是序列化Python字典(或其他支持类型)为标准JSON字符串的核心方法。对于复杂字典(包含嵌套、中文、日期、自定义对象等),需要注意编码、可序列化性以及格式控制。
确保字典内容可被 JSON 序列化
JSON 标准只支持 dict、list、str、int、float、bool、None 这几种类型。若字典中包含以下内容,会直接报 TypeError:
- datetime 对象(如
datetime.now()) - 自定义类实例(如
User(name='Alice')) - bytes 类型
- set 或其他不可序列化类型
解决方式:使用 default 参数提供转换逻辑。例如:
>>> import json
>>> from datetime import datetime
>>> data = {"name": "张三", "created": datetime.now(), "tags": {"python", "web"}}
>>> json.dumps(data, default=str, ensure_ascii=False, indent=2)
'{
"name": "张三",
"created": "2024-05-10 14:22:36.123456",
"tags": ["python", "web"]
}'
立即学习“Python免费学习笔记(深入)”;
处理中文与编码问题
默认情况下,json.dumps() 会将非 ASCII 字符(如中文)转义为 uXXXX 形式,导致字符串可读性差:
>>> json.dumps({"城市": "北京"})
'{"\u57ce\u5e02": "\u5317\u4eac"}'
添加 ensure_ascii=False 即可输出原生中文字符:
>>> json.dumps({"城市": "北京"}, ensure_ascii=False)
'{"城市": "北京"}'
提升可读性与调试体验
生成用于日志、API 响应或人工查看的 JSON 字符串时,建议启用格式化选项:
-
indent=2:添加缩进(2 个空格),使结构清晰 -
sort_keys=True:按键字母序排序,便于比对和版本控制 -
separators=(',', ': '):可选,控制键值间空格(默认已带空格)
示例:
>>> json.dumps({"b": 2, "a": 1}, indent=2, sort_keys=True, ensure_ascii=False)
'{
"a": 1,
"b": 2
}'
安全写入文件或传输前的注意事项
若需保存到文件,推荐直接用 json.dump()(注意是不带 s 的函数),它内部调用 dumps 并写入文件对象,自动处理编码:
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
若必须用 dumps 得到字符串再写入,请显式指定 encoding="utf-8"(尤其 Windows 系统下);否则可能因系统默认编码(如 cp936)导致写入失败或乱码。
本文共计727个文字,预计阅读时间需要3分钟。
在Python中,`json.dumps()`函数是序列化Python字典(或其他支持类型)为标准JSON字符串的核心方法。对于复杂字典(包含嵌套、中文、日期、自定义对象等),需要注意编码、可序列化性以及格式控制。
确保字典内容可被 JSON 序列化
JSON 标准只支持 dict、list、str、int、float、bool、None 这几种类型。若字典中包含以下内容,会直接报 TypeError:
- datetime 对象(如
datetime.now()) - 自定义类实例(如
User(name='Alice')) - bytes 类型
- set 或其他不可序列化类型
解决方式:使用 default 参数提供转换逻辑。例如:
>>> import json
>>> from datetime import datetime
>>> data = {"name": "张三", "created": datetime.now(), "tags": {"python", "web"}}
>>> json.dumps(data, default=str, ensure_ascii=False, indent=2)
'{
"name": "张三",
"created": "2024-05-10 14:22:36.123456",
"tags": ["python", "web"]
}'
立即学习“Python免费学习笔记(深入)”;
处理中文与编码问题
默认情况下,json.dumps() 会将非 ASCII 字符(如中文)转义为 uXXXX 形式,导致字符串可读性差:
>>> json.dumps({"城市": "北京"})
'{"\u57ce\u5e02": "\u5317\u4eac"}'
添加 ensure_ascii=False 即可输出原生中文字符:
>>> json.dumps({"城市": "北京"}, ensure_ascii=False)
'{"城市": "北京"}'
提升可读性与调试体验
生成用于日志、API 响应或人工查看的 JSON 字符串时,建议启用格式化选项:
-
indent=2:添加缩进(2 个空格),使结构清晰 -
sort_keys=True:按键字母序排序,便于比对和版本控制 -
separators=(',', ': '):可选,控制键值间空格(默认已带空格)
示例:
>>> json.dumps({"b": 2, "a": 1}, indent=2, sort_keys=True, ensure_ascii=False)
'{
"a": 1,
"b": 2
}'
安全写入文件或传输前的注意事项
若需保存到文件,推荐直接用 json.dump()(注意是不带 s 的函数),它内部调用 dumps 并写入文件对象,自动处理编码:
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
若必须用 dumps 得到字符串再写入,请显式指定 encoding="utf-8"(尤其 Windows 系统下);否则可能因系统默认编码(如 cp936)导致写入失败或乱码。

