用 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'}
如何使用 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'}