You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对继承自enum.Enum的枚举子类实例进行JSON序列化?

Enum子类实例JSON序列化解决方案

错误原因

  1. 原未使用enum.Enum的代码中,Color.TURQUOISE本身就是整数类型,属于JSON原生支持序列化的范畴,自定义序列化器my_default_serializer实际并未触发,因此运行正常。
  2. 改用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:09:00