简体   繁体   English

Can I covert python class to dictionary or json like Newtonsoft.Json.JsonConvert() in C#

[英]Can I covert python class to dictionary or json like Newtonsoft.Json.JsonConvert() in C#

I'd like to make a class which can convert class to dictionary or json directly with sizable list object我想做一个 class 可以将 class 转换为字典或 json 直接与相当大的列表 ZA8CFDE6331BD49EB2AC96F891

I'm using this dictionary uploading mongodb data我正在使用这本字典上传 mongodb 数据

I found a way multi layer dictionary converting, using dict() by overriding using __iter__ object我找到了一种多层字典转换的方法,使用 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)  

This return这次回归

{'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': ''}

I want items value is list of OrderItem class.我想要的项目值是 OrderItem class 的列表。 like this像这样

{"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": ""}

Is there any way to dict() output like this?有没有办法像这样 dict() output ?

Or other ways of converting class object to multilayer list dictionary或将 class object 转换为多层列表字典的其他方式

How about using @dataclass and as dict from dataclasses :如何使用@dataclassas dict dataclasses的字典:


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))  

Answer summary答案摘要

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)

dict = asdict(order)
print(dict)
print()

order_copy = from_dict(Order, dict)
dict = asdict(order_copy)
print(dict)
print()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM