实现jsonpickle自定义处理器时如何处理单个枚举值?
解决jsonpickle自定义处理器处理枚举值的问题
嘿,我来帮你搞定这个枚举序列化的问题!你的自定义Handler里的flatten方法其实很容易修改,只要把单个枚举实例转换成JSON可识别的类型(比如它的value或者name)就可以了。
先给你修改好的完整代码,带两种可选方案:
import jsonpickle from enum import Enum class Bar(Enum): A = 1 B = 2 class Foo: def __init__(self): self.hello = 'hello' self.bar = [Bar.A, Bar.B] class Handler(jsonpickle.handlers.BaseHandler): def flatten(self, obj, data): # obj就是单个枚举实例,比如Bar.A或Bar.B # 方案1:序列化枚举的数值value(推荐,保持数据类型一致) return obj.value # 方案2:序列化枚举的名称name # return obj.name # 如果需要反序列化回枚举类型,添加这个方法 def restore(self, obj): # obj是序列化后的值(比如1或者"A"),转成对应的枚举实例 return Bar(obj) jsonpickle.handlers.registry.register(Bar, Handler) def main(): fizbuz = Foo() # 测试序列化 serialized = jsonpickle.encode(fizbuz) print("序列化结果:", serialized) # 测试反序列化 deserialized = jsonpickle.decode(serialized) print("反序列化后的bar字段:", deserialized.bar) print("反序列化后是否为枚举实例:", isinstance(deserialized.bar[0], Bar)) if __name__ == "__main__": main()
关键说明:
- 在
flatten方法中,obj参数就是传入的单个枚举对象,你不需要操作空的data字典,直接返回枚举的value或name即可,jsonpickle会自动把这个值整合到最终的JSON结构里。 - 选
obj.value的话,序列化后的bar字段会是[1,2];选obj.name则是["A","B"],你可以根据业务需求选择。 - 如果需要把序列化后的JSON再反序列化回枚举实例,一定要实现
restore方法,它会把序列化后的值(比如1或者"A")转换回对应的Bar枚举对象,保证类型一致。
内容的提问来源于stack exchange,提问作者John Difool
相关产品推荐
相关产品推荐

