如何对Python泛型类进行JSON序列化?
解决Python泛型类序列化的AttributeError问题
错误原因
这个错误是因为泛型类实例的__dict__在部分场景下是只读的mappingproxy对象,json.dumps的默认处理逻辑尝试访问它的__dict__属性,触发了报错。
可行解决方法
1. 改用vars()函数获取属性字典
vars()函数可以安全返回实例的属性字典,自动适配mappingproxy类型:
print(json.dumps(r, default=lambda o: vars(o)))
2. 手动将mappingproxy转为普通字典
通过遍历__dict__的键值对构造普通字典,避免直接访问引发的问题:
print(json.dumps(r, default=lambda o: dict(o.__dict__)))
3. 显式指定序列化字段
如果类的属性固定,直接构造包含目标字段的字典,更直观且性能更好:
print(json.dumps(r, default=lambda o: {"param": o.param}))
4. 给泛型类添加序列化方法
在类内部定义专门的序列化方法,让代码结构更清晰,适合频繁序列化的场景:
class MyGenericClass(Generic[T]): def __init__(self, param: T) -> None: super().__init__() self.param = param def to_json(self): return {"param": self.param} # 序列化时调用该方法 print(json.dumps(r, default=lambda o: o.to_json()))
5. 使用dataclasses(推荐方案)
如果你的泛型类仅用于存储数据,dataclasses是更优选择,它原生支持泛型,且序列化逻辑更简洁:
from typing import TypeVar, Generic import json from dataclasses import dataclass, asdict T = TypeVar('T') @dataclass class MyGenericClass(Generic[T]): param: T r = MyGenericClass[str]('test') # 两种序列化方式都可行 print(json.dumps(r.__dict__)) print(json.dumps(asdict(r)))
内容的提问来源于stack exchange,提问作者anonim
相关产品推荐
相关产品推荐

