寻求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
相关产品推荐
相关产品推荐

