根本原因是Python对象类型不被JSON标准支持;仅dict、list、tuple、str、int、float、bool、None可原生序列化,datetime、Decimal、自定义类、bytes等均会触发TypeError。

直接用 json.dumps() 会报 TypeError: Object of type X is not JSON serializable,根本原因不是编码问题,而是 Python 对象本身不被 JSON 标准支持。
哪些类型能直接用 json.dumps() 不出错
只有以下内置类型可原生序列化:dict、list、tuple(转为 list)、str、int、float、bool、None。其他如 datetime、Decimal、自定义类实例、bytes 等都会触发 TypeError。
常见错误现象:
-
json.dumps(datetime.now())→TypeError: Object of type datetime is not JSON serializable -
json.dumps(MyClass())→ 同样报这个错,和编码无关 -
json.dumps(b"hello")→bytes类型也不行
用 default 参数处理不可序列化对象
这是最常用、最可控的解决方式。传一个函数给 default 参数,当遇到无法序列化的对象时,json.dumps() 会调用它,期望返回一个 JSON 支持的等价类型。
实操建议:
- 不要在
default函数里做复杂逻辑或抛异常,否则整个序列化失败 - 对
datetime,统一转成 ISO 格式字符串:obj.isoformat() - 对
Decimal,转成float或str(注意精度丢失风险) - 对自定义类,推荐显式定义
to_dict()方法,然后在default中调用
示例:
import json
from datetime import datetime
from decimal import Decimal
<p>def json_fallback(obj):
if isinstance(obj, datetime):
return obj.isoformat()
elif isinstance(obj, Decimal):
return float(obj) # 或 str(obj)
elif hasattr(obj, 'to_dict'):
return obj.to_dict()
raise TypeError(f"Object of type {type(obj).<strong>name</strong>} is not JSON serializable")</p><p>data = {"time": datetime.now(), "price": Decimal("29.99")}
json_str = json.dumps(data, default=json_fallback)
</p>
ensure_ascii=False 和编码的关系
很多人误以为加了 ensure_ascii=False 就能解决中文乱码,其实它只控制 ASCII 转义行为,不影响底层字节编码。
关键点:
-
json.dumps()返回的是str,不是bytes;它的编码由后续写入文件或网络传输决定 -
ensure_ascii=False让中文直接输出为字符(如"姓名"),而不是"\u59d3\u540d" - 写入文件时,必须显式指定
encoding="utf-8",否则可能因系统默认编码出问题
正确写法:
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
别踩的坑:别用 str() 或 repr() 强转
有人试过 json.dumps(str(obj)),看似不报错,但结果是字符串字面量,丢失原始结构和语义。
例如:
-
json.dumps(str(datetime.now()))→ 得到"2024-05-12 14:23:00.123456",但已不是标准时间格式,且毫秒精度可能被截断 -
json.dumps(repr(obj))→ 输出带引号的 repr 字符串,完全不可靠 - 用
lambda obj: str(obj)作default更危险:掩盖类型问题,下游解析时无法还原
真正需要序列化的对象,必须明确其语义转换规则,不能靠“看起来能过”。比如时间该用 ISO,枚举该用 .name 或 .value,模型该走 to_dict() —— 这些不是编码问题,是数据契约问题。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











