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

寻求Python数据结构遍历工具:JSON编码枚举预处理需求

解决Enum JSON编码及通用数据结构遍历问题

一、手动实现递归遍历转换

不用依赖第三方库,自己写递归函数即可处理任意嵌套的数据结构,批量将Enum实例转换为对应的值:

import enum
import json

class MyEnum(enum.Enum):
    VALUE1 = "val1"
    VALUE2 = "val2"

def convert_enums(obj):
    if isinstance(obj, enum.Enum):
        return obj.value  # 若需要枚举名称可替换为obj.name
    elif isinstance(obj, dict):
        return {k: convert_enums(v) for k, v in obj.items()}
    elif isinstance(obj, (list, tuple)):
        return type(obj)(convert_enums(item) for item in obj)
    else:
        return obj

# 使用示例
data = {"enum": MyEnum.VALUE1, "nested": {"list": [MyEnum.VALUE2, 123]}}
converted_data = convert_enums(data)
print(json.dumps(converted_data))
# 输出: {"enum": "val1", "nested": {"list": ["val2", 123]}}

这个函数可灵活扩展,新增判断逻辑就能处理其他自定义类型。

二、现成工具库

如果不想手动实现,以下PyPI库可直接使用:

  • objwalk:专门用于遍历任意嵌套的Python对象,支持自定义回调处理每个元素。安装后用法示例:
    from objwalk import objwalk
    
    def replace_enum(obj):
        if isinstance(obj, enum.Enum):
            return obj.value
        return obj
    
    converted_data = objwalk(data, replace_enum)
    
  • jsonpickle:可直接序列化包括Enum在内的大部分Python类型到JSON,无需手动预处理:
    import jsonpickle
    
    serialized = jsonpickle.encode(data, unpicklable=False)
    print(serialized)
    # 输出与手动转换结果一致
    

三、子类化JSONEncoder无效的原因

补充说明你遇到的问题本质:json.JSONEncoder的default方法仅在遇到无法序列化的类型时触发,但Enum实例默认会被序列化为<MyEnum.VALUE1>格式的字符串,属于可序列化范畴,因此重写的逻辑根本不会执行,这就是必须预处理的核心原因。

内容的提问来源于stack exchange,提问作者odigity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:35:18