如何使类 JSON 可序列化

新手上路,请多包涵

如何使 Python 类可序列化?

 class FileItem:
    def __init__(self, fname):
        self.fname = fname

尝试序列化为 JSON:

 >>> import json
>>> x = FileItem('/foo/bar')
>>> json.dumps(x)
TypeError: Object of type 'FileItem' is not JSON serializable

原文由 Sergey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 534
2 个回答

你对预期的输出有什么想法吗?例如,这会做吗?

 >>> f  = FileItem("/foo/bar")
>>> magic(f)
'{"fname": "/foo/bar"}'

在这种情况下,您只能调用 json.dumps(f.__dict__)

如果您想要更多自定义输出,那么您必须 JSONEncoder 并实现您自己的自定义序列化。

举个简单的例子,见下文。

 >>> from json import JSONEncoder
>>> class MyEncoder(JSONEncoder):
        def default(self, o):
            return o.__dict__

>>> MyEncoder().encode(f)
'{"fname": "/foo/bar"}'

然后将此类传递给 json.dumps() 方法为 cls kwarg:

 json.dumps(cls=MyEncoder)

如果您还想解码,则必须为 JSONDecoder 类提供自定义 object_hook 。例如:

 >>> def from_json(json_object):
        if 'fname' in json_object:
            return FileItem(json_object['fname'])
>>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}')
>>> f
<__main__.FileItem object at 0x9337fac>
>>>

原文由 Manoj Govindan 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个简单功能的简单解决方案:

.toJSON() 方法

代替 JSON 可序列化类,实现一个序列化器方法:

 import json

class Object:
    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__,
            sort_keys=True, indent=4)

所以你只需调用它来序列化:

 me = Object()
me.name = "Onur"
me.age = 35
me.dog = Object()
me.dog.name = "Apollo"

print(me.toJSON())

将输出:

 {
    "age": 35,
    "dog": {
        "name": "Apollo"
    },
    "name": "Onur"
}

原文由 Onur Yıldırım 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题