[英]Json serialization of nested dataclasses
我需要從Make the Python json 編碼器進一步支持 Python 的新數據類中進一步考慮有關json serialization of @dataclass
問題:考慮它們何時處於嵌套結構中。
考慮:
import json
from attr import dataclass
from dataclasses_json import dataclass_json
@dataclass
@dataclass_json
class Prod:
id: int
name: str
price: float
prods = [Prod(1,'A',25.3),Prod(2,'B',79.95)]
pjson = json.dumps(prods)
這給了我們:
TypeError: Object of type Prod is not JSON serializable
請注意,上面確實包含了答案之一 https://stackoverflow.com/a/59688140/1056563 。 它聲稱通過dataclass_json
裝飾器支持嵌套案例。 顯然這實際上不起作用。
我還嘗試了另一個答案https://stackoverflow.com/a/51286749/1056563 :
class EnhancedJSONEncoder(json.JSONEncoder):
def default(s, o):
if dataclasses.is_dataclass(o):
return dataclasses.asdict(o)
return super().default(o)
我為它創建了一個輔助方法:
def jdump(s,foo):
return json.dumps(foo, cls=s.c.EnhancedJSONEncoder)
但是使用該方法也不會影響(錯誤)結果。 任何進一步的提示?
import json
from dataclasses import dataclass, asdict
@dataclass
class Prod:
id: int
name: str
price: float
prods = [asdict(Prod(1, 'A', 25.3)), asdict(Prod(2, 'B', 79.95))]
pjson = json.dumps(prods)
print(pjson)
# [{"id": 1, "name": "A", "price": 25.3}, {"id": 2, "name": "B", "price": 79.95}]
您可以使用pydantic
庫。 從文檔中的示例
from pydantic import BaseModel
class BarModel(BaseModel):
whatever: int
class FooBarModel(BaseModel):
banana: float
foo: str
bar: BarModel
m = FooBarModel(banana=3.14, foo='hello', bar={'whatever': 123})
# returns a dictionary:
print(m.dict())
"""
{
'banana': 3.14,
'foo': 'hello',
'bar': {'whatever': 123},
}
"""
print(m.dict(include={'foo', 'bar'}))
#> {'foo': 'hello', 'bar': {'whatever': 123}}
print(m.dict(exclude={'foo', 'bar'}))
#> {'banana': 3.14}
這實際上不是一個直接的答案,而是對於不需要(或不需要)可變性的情況的更合理的解決方法。 基於typing
的NamedTuple
看起來和感覺都非常相似,並且可能是dataclass
背后的靈感。 如果需要序列化,它可能是目前最好的選擇。
from typing import NamedTuple
class Prod(NamedTuple):
id: str
name: str
price: str
我把它作為基於數據類的Prod
dataclass
的替代品,它可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.