Python-我可以将包含对象的对象转换为字典吗



例如-

class Object:
def __init__(self, string):
self.string = string

class example:
def __init__(self):
self.obj = Object('hello')

并且输出应该是-

{
'obj' : {
'string': 'hello'
}
}

我知道我可以用for循环和__ dict __来做这件事,但当有太多对象要处理时,这就变得很困难了。

有没有办法用一行或两行来完成这项工作?

如果您愿意使用dataclasses json库和dataclasses你可以这样做:

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_dictto_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"}}'

我喜欢dataclasses-json方法,但这里有使用dataclass向导库的类似方法。这同样是一个建立在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"}}

最新更新