Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
json.dumps()无法直接序列化enum成员,因其非基础类型且不自动调用__str__;需通过default参数、自定义jsonencoder或strenum(python 3.11+)实现序列化。

Python 的 Enum 默认不能被 json.dumps() 直接序列化,会抛出 TypeError: Object of type XXX is not JSON serializable —— 必须显式提供序列化逻辑。
为什么 json.dumps() 无法直接处理 Enum 成员
因为 Enum 成员是类的实例(如 Color.RED),不是基础类型(str/int),而 json 模块只认 dict、list、str、int、float、bool、None。它不会自动调用 __str__ 或 __repr__。
- 错误现象:
json.dumps({"status": Status.ACTIVE})→TypeError: Object of type Status is not JSON serializable - 即使你重写了
__str__,json也不会用它 -
Enum的value和name都是可访问属性,但需手动提取
最简方案:用 default 参数 + 类型判断
在 json.dumps() 中传入 default 回调函数,对 Enum 成员返回其 value(或 name)。
import json
from enum import Enum
<p>class Status(Enum):
ACTIVE = 1
INACTIVE = 0</p><p>data = {"status": Status.ACTIVE}
json_str = json.dumps(data, default=lambda x: x.value if isinstance(x, Enum) else None)</p><h1>→ {"status": 1}</h1><p></p>
- 推荐优先用
x.value,语义更接近“数据值”;若需字符串标识(如 API 返回字段名),改用x.name -
default函数必须覆盖所有非标准类型,否则仍会报错;建议加else raise TypeError(...)显式兜底 - 该方式不侵入原有
Enum类,适合临时、轻量场景
更健壮的做法:自定义 JSONEncoder 子类
当项目中多处需要序列化 Enum,且希望统一行为(比如所有 Enum 都转 name),应封装为独立编码器。
class EnumEncoder(json.JSONEncoder):
def encode(self, obj):
if isinstance(obj, Enum):
return json.dumps(obj.name) # 或 obj.value
return super().encode(obj)
<p>json.dumps(data, cls=EnumEncoder)
</p>
- 注意:不要重写
default方法后又调用super().default()—— 它默认返回NotImplemented,容易漏掉其他类型 - 如果
Enum值本身是str(如Color.RED = "red"),用obj.value更自然;若值是int但你想暴露语义名,才用obj.name - 该方案可配合
json.loads()的object_hook实现反序列化,但要注意:仅靠名字无法无歧义还原具体Enum类,需额外上下文
使用 StrEnum(Python 3.11+)简化字符串枚举序列化
若你的枚举值全是字符串,且运行环境 ≥ Python 3.11,StrEnum 是更干净的选择 —— 它继承自 str,天然可被 json 序列化。
from enum import StrEnum
<p>class Role(StrEnum):
ADMIN = "admin"
USER = "user"</p><p>json.dumps({"role": Role.ADMIN}) # → {"role": "admin"},无需任何额外配置
</p>
-
StrEnum成员既是str又是Enum成员,支持字符串操作(.upper())、in判断、类型检查 - 但它只解决“值为字符串”的场景;数值型、复合值(如
namedtuple)枚举仍需前述方案 - 低版本 Python 可用
class Role(str, Enum):模拟,但要注意isinstance(x, str)为True,可能影响某些类型分发逻辑
真正麻烦的不是怎么转,而是团队是否对“序列化时用 name 还是 value”达成一致 —— 同一个 Enum 在不同接口里混用两种策略,会让前端或下游服务难以维护。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










