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

实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:02