如何使用 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 不能序列化物件,我必須在此之前將它們轉換為 dicts。我可以為這樣的簡單物件做到這一點:
from tinydb import TinyDB
db = TinyDB
serialized_address = {"country": self.country, "city": self.city}
db.insert(serialized_address)
但是當另一個實體中有一個實體時我應該怎么做呢?(我被迫在我的專案中使用 TinyDB 和 JSON ......)
我唯一的線索是在第二個物件引數中放置第一個物件而不是物件本身的參考,但我不知道該怎么做......
uj5u.com熱心網友回復:
一種選擇是將任何現有的類轉換為dataclasses,它們只是具有一些自動生成方法的普通類,__init__
例如和__repr__
。
asdict
然后,您可以使用提供的幫助函式遞回地序列化嵌套資料類模型dataclasses
:
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
,或者需要將 json 加載或反序列化到資料類模型,我會查看像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'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/478582.html
上一篇:Java中的類和物件