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

时间:2012-09-18 19:39:06

标签: python json encoding

我正在尝试编写一个使用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()如何处理自定义类?

如果需要澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

您将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"
]