用 json 在另一个对象中序列化 Python 对象?

Serialize Python object in another object with json?

如何使用 TinyDB 序列化一个对象,该对象的属性中有另一个对象?

class address:
    def __init__(self, country, city):
        self.country = country
        self.city = city


class Person:
    def __init__(self, name, address):
        self.name = name
        self.address = address


add = Address("USA", "New York")
person = Person("John", add)

现在,当我尝试序列化时 person 我得到了这个错误:

TypeError: Object of type Address is not JSON serializable

我知道 JSON 无法序列化对象,我必须在此之前将它们转换为字典。我可以为这样一个简单的对象做到这一点:

from tinydb import TinyDB

db = TinyDB


serialized_address = {"country": self.country, "city": self.city}

db.insert(serialized_address)

但是当另一个实例中有一个实例时,我应该怎么做呢? (我不得不为我的项目使用 TinyDB 和 JSON...)

我唯一的线索是在第二个对象参数中放置第一个对象的引用而不是对象本身,但我不知道该怎么做...

一个选项是将任何现有的 类 转换为 dataclasses,这只是普通的 类 和一些自动生成的方法,例如 __init____repr__例如。

然后,您可以使用 dataclasses 提供的 asdict 辅助函数递归序列化嵌套数据类模型:

from dataclasses import dataclass, asdict


@dataclass
class Person:
    name: str
    address: 'Address'


@dataclass
class Address:
    country: str
    city: str


add = Address("USA", "New York")
person = Person("John", add)

serialized = asdict(person)
print(serialized)
# {'name': 'John', 'address': {'country': 'USA', 'city': 'New York'}}

如果您需要使用更复杂的类型,例如 datetime,或者需要加载或 de-serialize json 到数据类模型,我会查看 de/serialization 库,例如 dataclass-wizard,可以帮助进一步简化这个过程:

from dataclasses import dataclass
from datetime import date

from dataclass_wizard import fromdict, asdict


@dataclass
class Person:
    name: str
    address: 'Address'
    birth_date: date


@dataclass
class Address:
    country: str
    city: str


person = fromdict(Person, {'name': 'John', 'BirthDate': '1990-01-01', 'address': {'country': 'USA', 'city': 'New York'}})

print(person)
# Person(name='John', address=Address(country='USA', city='New York'), birth_date=datetime.date(1990, 1, 1))

serialized = asdict(person)
print(serialized)
# {'name': 'John', 'address': {'country': 'USA', 'city': 'New York'}, 'birthDate': '1990-01-01'}