json.dump()是最直接稳妥的JSON写入方法,需显式指定ensure_ascii=False和encoding="utf-8",配合indent=2提升可读性;它直接序列化并写入文件,而json.dumps()仅返回字符串。

json.dump() 是最直接、最稳妥的选择,只要数据是标准 Python 类型(dict、list、str、int、float、bool、None),就别绕弯用 json.dumps() + file.write()。
什么时候该用 json.dump() 而不是 json.dumps()
两者都能存 JSON,但适用场景不同:json.dump() 直接写文件,json.dumps() 只生成字符串。如果你最终目标是落盘到文件,json.dump() 更少出错、更省事。
-
json.dump(data, file_obj, indent=2)—— 一行搞定序列化+写入,自动处理编码、换行、缩进 -
json.dumps(data, indent=2)+file.write()—— 多一步,容易漏掉encoding='utf-8',中文会变\u4f60\u597d - 如果后续还要对 JSON 字符串做修改(比如拼接、注入字段),才需要先
dumps;否则纯存储,dump是默认动作
json.dump() 必须加的两个参数
不加它们,文件可能乱码或难以调试:
-
indent=2:让生成的 JSON 换行缩进,方便人眼阅读和 diff 对比;生产环境可省略,但开发阶段强烈建议加上 -
ensure_ascii=False:否则中文、emoji 等非 ASCII 字符全被转义成\uXXXX;这个参数必须显式传,没有默认值 - 文件打开时务必用
encoding='utf-8',尤其 Windows 上默认编码可能是cp936,不指定就会报错或乱码
正确写法示例:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
import json
data = {"姓名": "张三", "爱好": ["编程", "登山"]}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
dataclass、datetime、自定义对象不能直接 json.dump()
遇到 TypeError: Object of type X is not JSON serializable 就是这类问题。Python 的 json 模块只认原生类型,不认 dataclass 实例、datetime、set、bytes 等。
立即学习“Python免费学习笔记(深入)”;
- 简单
dataclass:先用dataclasses.asdict()转成字典再 dump -
datetime:统一转成 ISO 格式字符串,例如dt.isoformat() - 复杂对象:需自定义
json.JSONEncoder子类,重写default()方法 - 千万别用
str(obj)强转——它输出的是 Python 表示形式,不是合法 JSON
写入失败的常见信号和应对
不是所有错误都会抛异常,有些静默失败会让你以为存成功了,实际文件为空或损坏:
- 文件路径含非法字符(如
../config.json在沙箱环境被拦截)、目录不存在 → 报FileNotFoundError,需提前os.makedirs(os.path.dirname(path), exist_ok=True) - 权限不足(尤其 Linux/macOS 写系统目录)→
PermissionError - 数据里混入
NaN或inf→ValueError,JSON 不支持这些浮点特殊值,得提前转成None或字符串 - 写入后立即读取却读不到最新内容?检查是否忘了
with块,或手动close()前就去读 —— 文件缓冲区还没刷出去

















