Skip to main content
 首页 » 编程设计

python之如何为自定义类实现默认序列化方法

2025年05月04日12Leo_wl

我正在尝试编写一个使用 json 对象进行通信的程序,但在使用自定义类时遇到了麻烦。基本上,我传递给 json.dumps 的对象是一个大字典,大部分只使用基本类(字符串、列表和其他字典),但在某些情况下,我必须将字符串映射到自定义类 A 的对象。

当我使用这些对象时,我收到如下消息:

TypeError: <module.A object at 0x01659110> is not JSON serializable 

我想做的是为类型A的对象写一个默认的编码方法。对象非常简单,只包含一个标签(str类型)和一些各种整数。标签足以唯一标识A,所以如果json单独使用标签就可以了。

在网上看了很多类似的问题后,我得出的结论是:

class AEncoder(json.JSONEncoder): 
    def default(self, o): 
        if isinstance(o, A): 
            return o.label 
        else: 
            return super(AEncoder, self).default(o) 

问题是,我从所有来源获得的信息都包括这样的调用:

AEncoder().encode(object)  

这需要在将对象传递到 json.dumps() 之前调用,但我无法事先访问该对象。它藏在前面提到的大字典里,有时我无法访问。我也试过实现 A 的 __repr__功能,但我得到了同样的错误。

所以...尝试总结版本:我如何判断 json.dumps()当我无法访问传递给 json.dumps() 的特定对象时如何处理自定义类?

如果需要任何说明,请告诉我。

请您参考如下方法:

您将 cls 参数传递给 dump功能:

json.dumps(obj, cls=AEncoder) 

这是一个示例用法:

>>> class Something(object): 
...    def __init__(self, v): 
...       self.v = v 
...  
>>> import json 
>>> class SEncoder(json.JSONEncoder): 
...    def default(self, obj): 
...       if isinstance(obj, Something): 
...          return {'classtype': 'Something', 'v': obj.v} 
...       return json.JSONEncoder.default(self, obj) 
...  
>>> s1 = Something(3) 
>>> s2 = Something(4) 
>>> o = [s1, s2, 6, "hello"] 
>>> print json.dumps(o, cls=SEncoder, indent=2) 
[ 
  { 
    "classtype": "Something",  
    "v": 3 
  },  
  { 
    "classtype": "Something",  
    "v": 4 
  },  
  6,  
  "hello" 
]