我正在尝试编写一个使用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()
如何处理自定义类?
如果需要澄清,请告诉我。
答案 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"
]