将一个Python类对象序列化为JSON

本教程介绍了序列化过程。它还说明了我们如何使用toJSON() 方法使一个JSON类可序列化,并在其类中包装JSON来转储。

Python中的序列化

序列化过程涉及到将一个对象转换为一种可以保存并在以后检索的格式。比如通过将一个对象的状态记录到一个文件中。

所有的开发者都必须在某个时候对所有的项目进行序列化,哪怕是稍微复杂的项目。在许多典型的编程工作中,Python编程语言的简单性是其出色的特点之一。

只需几行代码,文件IO、画图和访问在线内容都变得简单。同样,python也使序列化变得简单,除了在试图序列化一个自定义类时。

下面我们来学习如何将你的类对象序列化为JSON对象。

使一个Python类成为可序列化的JSON对象

Python内置的json 模块只能处理有直接JSON对应的Python原始类型。

显然,JSON 编码器、json.dump()json.dumps() 的默认功能仅限于序列化最基本的一组对象类型 (例如,字典、列表、字符串、数字、None 等)。

为了解决这个问题,我们必须创建一个独特的编码器,使我们的类JSON可序列化。

有可能通过各种方法使Python类的JSON可序列化。选择最适合你情况复杂性的选项。

有两种使JSON类可序列化的主要方法,在下面给出:

  1. toJSON() 方法
  2. 将JSON包起来转储在其类中

使用toJSON() 方法来使JSON类可序列化

我们可以实现serializer方法而不是JSON可序列化类。例如,在这个方法中,Object 类可能有一个JSON函数,返回一个Object 信息的字典。

由于所有的Object 属性都是本地类型,我们可以将这个字典送入一个编码函数,以获得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 = "kelvin"
me.age = 20
me.dog = Object()
me.dog.name = "Brunno"
print(me.toJSON())

输出:

{
    "age": 20,
    "dog": {
        "name": "Brunno"
    },
    "name": "kelvin"
}

将JSON包在其类中转储

另一个解决方案是对JsonSerializable 类进行子类化,创建一个FileItem 类来包装JSON转储,如以下代码所示。

示例代码:

from typing import List
from dataclasses import dataclass, asdict, field
from json import dumps
@dataclass
class Students:
    id: 1
    name: "stu1"
    @property
    def __dict__(self):
        return asdict(self)
    @property
    def json(self):
        return dumps(self.__dict__)
test_object_1 = Students(id=1, name="Kelvin")
print(test_object_1.json)

输出:

{"id": 1, "name": "Kelvin"}