我正在尝试编写一个使用 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"
]
关于python - 如何为自定义类实现默认序列化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483851/