我可以像C#中的Newtonsoft.json.JsonConvert()一样将python类转换为dictionary



我想创建一个类,它可以用相当大的列表对象直接将类转换为dictionary或json

我正在使用这个字典上传mongodb数据

我找到了一种多层字典转换的方法,使用dict((重写__iter_object

###############################################################
# __iter__ override
class Singleton(type):
def __iter__(self):
for attr1_name in dir(self):
attr1 = getattr(self, attr1_name)
if not "__" in attr1_name:
if callable(attr1):
for attr2_name in dir(attr1):
if not "__" in attr2_name:
attr2 = getattr(attr1, attr2_name)
yield (attr1_name, dict(attr1)) 
else:
yield (attr1_name, attr1)
################################################################
# data structure
class OrderItem(metaclass=Singleton):
ridx = -1
tray = -1
batter = -1
fry = -1
class Data(metaclass=Singleton):
request_id = 0
order_id = "random_str"
items = OrderItem
items2 = list(OrderItem)
def __init__(self) -> None:
self.items2.append(OrderItem)
self.items2.append(OrderItem)

class Order(metaclass=Singleton):
key = ""
command = "order"
data = Data
o = Order
d = dict(o)
print(d)  

此返回

{'command': 'order', 'data': {'items': {'batter': -1, 'fry': -1, 'ridx': -1, 'tray': -1}, 'items2': [('batter', -1), ('fry', -1), ('ridx', -1), ('tray', -1)], 'order_id': 'random_str', 'request_id': 0}, 'key': ''}

我想要items的值是OrderItem类的列表。像这个

{"command": "order", "data": {"items": [{"batter": -1, "fry": -1, "ridx": -1, "tray": -1}, {"batter": -1, "fry": -1, "ridx": -1, "tray": -1}], "order_id": "random_str", "request_id": 0}, "key": ""}

有什么方法可以像这样dict((输出吗?

或其他将类对象转换为多层列表字典的方法

dataclasses:使用@dataclassas dict怎么样


from dataclasses import dataclass, field, as_dict
@dataclass
class OrderItem(metaclass=Singleton):
ridx = -1
tray = -1
batter = -1
fry = -1
@dataclass
class Data(metaclass=Singleton):
request_id = 0
order_id = "random_str"
items : list[OrderItem] = field(default_factory=list)
def __init__(self) -> None:
self.items2.append(OrderItem())

@dataclass
class Order(metaclass=Singleton):
key = ""
command = "order"
data = Data
o = Order
print(as_dict(o))  

回答摘要

from dataclasses import dataclass, field, asdict, astuple
from dacite import from_dict
from typing import List
@dataclass
class OrderItem:
ridx: int = -1
tray: int = -1
batter: int = -1
fry: int = -1
@dataclass
class Data:
request_id: int = -1
order_id: str = ""
items: List[OrderItem] = field(default_factory=list)
@dataclass       
class Order:
key : str = ""
command: str = "order"
data: Data  = field(default_factory=object)
items = [OrderItem (0,0,2,3), OrderItem (0,0,1,2), OrderItem (0,0,1,1), OrderItem(0,0,0,0)]
data = Data(0, "oid2920", items)
order = Order("order_key", "order", data)
# dataclass to dict
dict = asdict(order)
print(json.dumps(dict, sort_keys=True, indent=4))
print()
# dict to dataclass
order_copy = from_dict(Order, dict)
dict = asdict(order_copy)
print(json.dumps(dict, sort_keys=True, indent=4))
print()

数据类到字典和字典到数据类的结果转换打印结构的json

{
"command": "order",
"data": {
"items": [
{
"batter": 2,
"fry": 3,
"ridx": 0,
"tray": 0
},
{
"batter": 1,
"fry": 2,
"ridx": 0,
"tray": 0
},
{
"batter": 1,
"fry": 1,
"ridx": 0,
"tray": 0
},
{
"batter": 0,
"fry": 0,
"ridx": 0,
"tray": 0
}
],
"order_id": "oid2920",
"request_id": 0
},
"key": "order_key"
}

最新更新