如何使用Python的json.dumps函数将复杂字典对象有效转换为标准字符串流?

2026-05-07 22:461阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计727个文字,预计阅读时间需要3分钟。

如何使用Python的json.dumps函数将复杂字典对象有效转换为标准字符串流?

在Python中,`json.dumps()`函数是序列化Python字典(或其他支持类型)为标准JSON字符串的核心方法。对于复杂字典(包含嵌套、中文、日期、自定义对象等),需要注意编码、可序列化性以及格式控制。

确保字典内容可被 JSON 序列化

JSON 标准只支持 dictliststrintfloatboolNone 这几种类型。若字典中包含以下内容,会直接报 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.dumps()`函数是序列化Python字典(或其他支持类型)为标准JSON字符串的核心方法。对于复杂字典(包含嵌套、中文、日期、自定义对象等),需要注意编码、可序列化性以及格式控制。

确保字典内容可被 JSON 序列化

JSON 标准只支持 dictliststrintfloatboolNone 这几种类型。若字典中包含以下内容,会直接报 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)导致写入失败或乱码。