下面我将从基础到高级,详细讲解如何进行转换。
核心方法:json.dumps()
json 模块提供了 dumps() (dump string) 函数,专门用于将 Python 对象(如字典)转换为 JSON 格式的字符串。
基础转换
这是最简单的用法,适用于字典中的所有键都是字符串,且所有值都是 JSON 支持的基本数据类型(如 str, int, float, bool, list, dict, None)。
import json
# 一个标准的 Python 字典
my_dict = {
"name": "张三",
"age": 30,
"is_student": False,
"courses": ["数学", "物理"],
"address": {
"city": "北京",
"district": "海淀区"
},
"phone": None
}
# 使用 json.dumps() 将字典转换为 JSON 字符串
json_string = json.dumps(my_dict)
print(json_string)
输出:
{"name": "张三", "age": 30, "is_student": false, "courses": ["数学", "物理"], "address": {"city": "北京", "district": "海淀区"}, "phone": null}
注意:
- Python 的
True/False在 JSON 中对应true/false(小写)。 - Python 的
None在 JSON 中对应null。 - JSON 的键(key)必须是双引号包裹的字符串。
json.dumps()会自动处理这一点。
格式化输出(美化 JSON)
默认情况下,json.dumps() 输出的 JSON 字符串是压缩在一行的,可读性较差,你可以使用 indent 参数来美化输出,使其格式化。
import json
my_dict = {
"name": "李四",
"age": 25,
"skills": ["Python", "Java", "SQL"]
}
# 使用 indent=4 进行美化,缩进为4个空格
pretty_json_string = json.dumps(my_dict, indent=4, ensure_ascii=False)
print(pretty_json_string)
输出:
{
"name": "李四",
"age": 25,
"skills": [
"Python",
"Java",
"SQL"
]
}
重要参数:ensure_ascii=False
默认情况下,json.dumps() 会将所有非 ASCII 字符(如中文)转义成 \u 形式,为了在 JSON 字符串中直接显示中文,你需要设置 ensure_ascii=False。
处理中文和编码问题
当你需要将 JSON 字符串写入文件时,编码问题就变得非常重要,推荐使用 UTF-8 编码。
1 写入文件(json.dump())
json 模块还有一个 dump() (dump) 函数,它可以直接将 Python 对象写入到文件中,无需先转换为字符串,这个方法更高效。
import json
my_dict = {
"name": "王五",
"city": "上海"
}
# 使用 'w' 模式打开文件,并指定 encoding='utf-8'
with open('data.json', 'w', encoding='utf-8') as f:
# dump() 函数可以直接写入文件
# indent=4 用于美化,ensure_ascii=False 用于保证中文正常显示
json.dump(my_dict, f, indent=4, ensure_ascii=False)
print("JSON 文件已成功创建。")
执行后,会生成一个名为 data.json 的文件,内容如下:
{
"name": "王五",
"city": "上海"
}
处理非 JSON 原生类型
如果你的字典中包含了 JSON 不直接支持的数据类型(datetime 对象),json.dumps() 会直接报错。
import json
from datetime import datetime
my_dict = {
"event": "产品发布会",
"time": datetime.now() # datetime 对象
}
try:
json.dumps(my_dict)
except TypeError as e:
print(f"错误: {e}")
输出:
错误: Object of type datetime is not JSON serializable
解决方案:自定义 default 函数
你可以通过 json.dumps() 的 default 参数,传入一个函数来处理这些特殊类型,这个函数会接收一个非 JSON 原生的对象,并返回一个 JSON 可以表示的值(如字符串)。
import json
from datetime import datetime
my_dict = {
"event": "产品发布会",
"time": datetime.now()
}
# 定义一个处理特殊类型的函数
def custom_serializer(obj):
if isinstance(obj, datetime):
# 将 datetime 对象转换为 ISO 格式的字符串
return obj.isoformat()
# 如果不是已知类型,抛出 TypeError
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 使用 default 参数传入自定义函数
json_string = json.dumps(my_dict, default=custom_serializer, ensure_ascii=False)
print(json_string)
输出(示例):
{"event": "产品发布会", "time": "2025-10-27T10:30:00.123456"}
总结与常用参数
| 函数 | 功能 | 常用参数 |
|---|---|---|
json.dumps(obj) |
将 Python 对象转换为 JSON 字符串 | indent: 缩进空格数,用于美化。ensure_ascii: 是否将非 ASCII 字符转义,设为 False 可正常显示中文。default: 一个函数,用于处理无法序列化的对象。 |
json.dump(obj, fp) |
将 Python 对象写入到文件对象 fp 中 |
参数与 dumps 相同,多了一个文件对象参数 fp。 |
完整示例
import json
from datetime import datetime
# 1. 定义一个包含多种数据类型的字典
data = {
"id": 101,
"user_name": "Charlie",
"is_active": True,
"scores": [88, 92, 76],
"profile": {
"email": "charlie@example.com",
"signup_date": datetime(2025, 1, 15)
}
}
# 2. 定义一个自定义序列化器,处理 datetime 类型
def handle_datetime(obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
raise TypeError(f"Type {type(obj)} not serializable")
# 3. 将字典转换为格式化的 JSON 字符串
# 使用 indent=4 美化,ensure_ascii=False 保留中文,default 处理特殊类型
json_str = json.dumps(data, indent=4, ensure_ascii=False, default=handle_datetime)
print("--- 转换后的 JSON 字符串 ---")
print(json_str)
# 4. 将 JSON 字符串写入到文件
with open('user_profile.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False, default=handle_datetime)
print("\n--- JSON 文件已成功生成 user_profile.json ---")
这个例子涵盖了从基本转换、美化、处理中文到处理自定义类型(datetime)以及写入文件的完整流程,是实际开发中非常实用的代码。
