我有一个这样定义的类
class A:
def __init__(self):
self.item1 = None
def __repr__(self):
return str(self.__dict__)
当我这样做时:
>>> import simplejson
>>> myA = A()
>>> simplejson.dumps(myA)
TypeError: {'item1': None} is not JSON serializable
我找不到原因。
我是否需要为 simplejson 添加任何特定方法到 A 以序列化我的类对象?
最佳答案
您不能使用 simplejson
序列化任意对象。您需要将 default
和 object_hook
传递给 dump
和 load
。这是一个例子:
class SerializerRegistry(object):
def __init__(self):
self._classes = {}
def add(self, cls):
self._classes[cls.__module__, cls.__name__] = cls
return cls
def object_hook(self, dct):
module, cls_name = dct.pop('__type__', (None, None))
if cls_name is not None:
return self._classes[module, cls_name].from_dict(dct)
else:
return dct
def default(self, obj):
dct = obj.to_dict()
dct['__type__'] = [type(obj).__module__,
type(obj).__name__]
return dct
registry = SerializerRegistry()
@registry.add
class A(object):
def __init__(self, item1):
self.item1 = item1
def __repr__(self):
return str(self.__dict__)
def to_dict(self):
return dict(item1=self.item1)
@classmethod
def from_dict(cls, dct):
return cls(**dct)
s = json.dumps(A(1), default=registry.default)
a = json.loads(s, object_hook=registry.object_hook)
结果是:
>>> s
'{"item1": 1, "__type__": ["__main__", "A"]}'
>>> a
{'item1': 1}
但您真正需要的是一个函数 default
,它根据您希望序列化的对象创建字典,以及一个函数 object_hook
返回一个对象(正确的type) 当它被赋予字典时,如果字典不够用。最好的方法是在可序列化类上使用方法,这些方法从对象创建一个字典并将其构造回来,并且还有一个映射来识别字典属于哪个类。
您还可以向类添加标识符以用作 _classes
的索引。这样,如果您必须移动类(class),就不会遇到问题。
关于python - 如何使 simplejson 可序列化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4821940/