例如 -
class Object:
def __init__(self, string):
self.string = string
class example:
def __init__(self):
self.obj = Object('hello')
并且輸出應該是 -
{
'obj' : {
'string': 'hello'
}
}
我知道我可以用 for 回圈和 __ dict __ 來做到這一點,但是當有太多物件要處理時會變得很困難。
有沒有辦法在一兩行中做到這一點?
uj5u.com熱心網友回復:
如果您愿意使用dataclasses-json 庫和資料類, 您可以這樣做:
from dataclasses_json import dataclass_json
@dataclass_json
@dataclasses.dataclass
class InnerClass:
foo: int
bar: str
@dataclass_json
@dataclasses.dataclass
class OuterClass:
inner: InnerClass
然后您將能夠使用to_dict和to_json方法:
>>> obj = OuterClass(InnerClass(foo=1, bar="some string"))
>>> obj.to_dict()
{'inner': {'foo': 1, 'bar': 'some string'}}
>>> obj.to_json()
'{"inner": {"foo": 1, "bar": "some string"}}'
uj5u.com熱心網友回復:
我喜歡dataclasses-json方法,但這里有使用dataclass-wizard庫的類似方法。這同樣是一個建立在 之上的序列化框架dataclasses,有一些顯著的區別;例如,請注意,在這種情況下,我們不需要裝飾或子類化內部資料類。
from __future__ import annotations
from dataclasses import dataclass
from dataclass_wizard import JSONWizard
@dataclass
class OuterClass(JSONWizard):
inner: InnerClass
@dataclass
class InnerClass:
foo: int
bar: str
# serialize instance
obj = OuterClass(InnerClass(foo=1, bar="some string"))
obj.to_dict()
# {'inner': {'foo': 1, 'bar': 'some string'}}
您會注意到在這種情況下輸出完全相同。
替代解決方案
其他選項可以dataclasses.asdict用于將實體轉換為dict物件。如果您想直接將實體序列化為 JSON 字串,您也可以使用json.dumps和傳遞default引數。這兩個選項如下所示。
import json
from dataclasses import dataclass, asdict
@dataclass
class OuterClass:
inner: 'InnerClass'
@dataclass
class InnerClass:
foo: int
bar: str
obj = OuterClass(InnerClass(foo=1, bar="some string"))
# 1-- dataclasses.asdict
asdict(obj)
# {'inner': {'foo': 1, 'bar': 'some string'}}
# 2-- json.dumps with `default`. Note that result is a string!
json.dumps(obj, default=lambda o: o.__dict__)
# {"inner": {"foo": 1, "bar": "some string"}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368167.html
