如何对继承自enum.Enum的枚举子类实例进行JSON序列化?
Enum子类实例JSON序列化解决方案
错误原因
- 原未使用
enum.Enum的代码中,Color.TURQUOISE本身就是整数类型,属于JSON原生支持序列化的范畴,自定义序列化器my_default_serializer实际并未触发,因此运行正常。 - 改用
Enum后,Color['TURQUOISE']返回的是Enum类的实例对象,不属于JSON原生可序列化类型,会触发自定义序列化器;而Enum实例内部属性使用只读的mappingproxy存储,不存在公开的__dict__属性,因此访问时报错。
解决方案
修改自定义序列化器,增加Enum类型的判断逻辑,直接返回Enum实例的value属性(即枚举对应的值)即可满足需求:
import json from enum import Enum class Color(Enum): FUSCHIA = 0x00 TURQUOISE = 0x01 EMERALD = 0x02 def my_default_serializer(o): # 针对Enum类型做特殊处理 if isinstance(o, Enum): return o.value # 其他类型按原有逻辑处理,可根据需求扩展 raise TypeError(f"Object of type {o.__class__.__name__} is not JSON serializable") def get_colors(): return json.dumps( { 'dark_bg': True, 'colors_batch': [Color['TURQUOISE'], Color['EMERALD']] }, default=my_default_serializer ) print(get_colors())
运行后即可得到预期输出:
{"dark_bg": true, "colors_batch": [1, 2]}
扩展用法
如果需要序列化枚举的名称而非对应值(比如输出可读性更高的"TURQUOISE"而非1),只需将序列化器中返回的o.value改为o.name即可,修改后输出如下:
{"dark_bg": true, "colors_batch": ["TURQUOISE", "EMERALD"]}
内容的提问来源于stack exchange,提问作者Sam7919
相关产品推荐
相关产品推荐

