在Python开发中,将内存中的数据持久化保存到JSON文件是高频需求,无论是存储配置信息、接口返回数据还是程序运行结果,JSON格式都因为通用性强、可读性高被广泛使用。Python标准库自带了json模块,不需要额外安装第三方库就能完成相关操作。

基础保存方法
使用json模块的dump方法可以直接将Python对象写入到JSON文件中,最基础的用法只需要三行代码就能完成。
import json
# 待保存的Python数据,支持字典、列表等可序列化类型
data = {
"name": "测试数据",
"age": 25,
"hobbies": ["阅读", "编程", "运动"]
}
# 打开文件并写入JSON数据,注意使用w模式,编码设置为utf-8避免中文乱码
with open("output.json", "w", encoding="utf-8") as f:
json.dump(data, f)
运行上述代码后,当前目录下会生成output.json文件,内容如下:
{"name": "测试数据", "age": 25, "hobbies": ["阅读", "编程", "运动"]}
常用参数说明
json.dump方法还有很多可选参数,能够调整输出JSON文件的格式,适配不同的使用场景。
indent参数:格式化输出
默认的JSON输出是紧凑格式,没有换行和缩进,可读性较差。设置indent参数可以指定缩进的空格数,让输出的JSON文件更易阅读。
import json
data = {
"user_id": 1001,
"username": "zhangsan",
"score": 95.5,
"is_active": True
}
with open("formatted_output.json", "w", encoding="utf-8") as f:
# indent=4表示使用4个空格作为缩进
json.dump(data, f, indent=4, ensure_ascii=False)
生成的formatted_output.json内容如下:
{
"user_id": 1001,
"username": "zhangsan",
"score": 95.5,
"is_active": true
}
ensure_ascii参数:处理中文
默认情况下,json模块会将非ASCII字符(比如中文)转义为Unicode编码,设置ensure_ascii=False可以保留原始的中文内容,避免输出类似u6d4bu8bd5的乱码形式。
sort_keys参数:按键排序
如果希望输出的JSON对象的键按照字母顺序排列,可以设置sort_keys=True,默认值为False。
import json
data = {"c": 3, "a": 1, "b": 2}
with open("sorted_output.json", "w", encoding="utf-8") as f:
json.dump(data, f, sort_keys=True, indent=4)
生成的文件内容会按键排序:
{
"a": 1,
"b": 2,
"c": 3
}
特殊数据类型处理
json模块默认只能序列化部分Python内置数据类型,比如字典、列表、字符串、数字、布尔值、None,如果遇到datetime、自定义类实例等类型,直接序列化会抛出TypeError。
可以通过自定义序列化函数,然后赋值给default参数来解决这类问题。
import json
from datetime import datetime
# 自定义序列化处理函数
def custom_serializer(obj):
if isinstance(obj, datetime):
# 将datetime对象转换为字符串格式
return obj.strftime("%Y-%m-%d %H:%M:%S")
# 其他不支持的类型抛出异常
raise TypeError(f"类型 {type(obj)} 不支持JSON序列化")
data = {
"event": "数据保存测试",
"create_time": datetime.now(),
"count": 10
}
with open("special_type_output.json", "w", encoding="utf-8") as f:
json.dump(data, f, default=custom_serializer, indent=4, ensure_ascii=False)
运行后生成的文件会正确保存时间字符串:
{
"event": "数据保存测试",
"create_time": "2024-05-20 14:30:00",
"count": 10
}
常见注意事项
- 打开文件时建议使用with语句,不需要手动关闭文件,避免资源泄露问题
- 写入文件时编码建议统一设置为utf-8,尤其是包含中文内容时,避免出现乱码
- 如果需要先获取JSON字符串再手动写入文件,可以使用json.dumps方法,它和dump方法的参数基本一致,只是返回字符串而不是写入文件
- JSON格式中布尔值是小写的true和false,null对应Python的None,和Python的语法有区别,读取时需要注意
如果需要处理更复杂的JSON操作,比如修改已有JSON文件的部分内容,建议先读取文件内容到Python对象,修改后再重新写入,不要直接对JSON文件做局部修改。