python - 如何使 simplejson 可序列化类

标签 python serialization simplejson

我有一个这样定义的类

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 序列化任意对象。您需要将 defaultobject_hook 传递给 dumpload。这是一个例子:

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/

相关文章:

python - 将结构*从一个 Cython 类传递到另一个

c# - C# 中是否有 ShouldSerialize[PropertyName] 的替代方案?

java - 使用类型信息优雅地忽略 Jackson JSON 反序列化中的未知类?

javascript - JSON.stringify 向我的 Json 对象添加额外的\和 ""的问题

javascript - 为什么用于 html 的 simplejson 编码器使用\\u0026 转义而不是 & 让 XSS 发生?

python - 类似于 simplejson/json 的 XML 库? - Python

python - python 3 中的 np.genfromtxt 错误

python - 使用 pytest 测试 pyqt 应用程序

python - 如何从 pandas 的列子集中选择行子集

c# - 如何使用 SimpleJson c# 获取 Json 文件中的 key