【问题标题】:Convert JSON to a class [duplicate]将 JSON 转换为类 [重复]
【发布时间】:2021-11-06 11:40:22
【问题描述】:

如何从 Json 创建一个 python 实例?

我也尝试过namedtuple解决方案,但是从namedtuple创建实例后无法设置字段

例如我们有以下类

class Settings:
    item1: int
    item2: list

    def __init__(self):
        self.item1 = 0
        self.item2 = []

【问题讨论】:

    标签: python json


    【解决方案1】:

    你应该使用 'setattr' 方法将 item 设置为类,并创建一个 Struct 类来将 dict 转换为类

    import dataclasses
    from dateutil.parser import parse
    
    @dataclasses.dataclass
    class Struct:
        pass
    
    def is_date(string, fuzzy=False):
        try:
            parse(string, fuzzy=fuzzy)
            return True
        except ValueError:
            return False
    
    class Settings:
        item1: int
        item2: list
    
        def __init__(self):
            self.item1 = 0
            self.item2 = []
    
        @staticmethod
        def load():
            # Create config file if not exists
            if not os.path.exists("settings.json"):
                with open("settings.json", "w", encoding="utf8") as file:
                    file.write(json.dumps(Settings().__dict__, indent=4, sort_keys=True))
    
            def decoder(items, type):
                instance = type()
                for item in items:
                    if isinstance(items[item], list) and len(items[item]) > 0 and isinstance(items[item][0], dict):
                        setattr(instance, item, list(map(lambda x: decoder(x, Struct), items[item])))
                    elif isinstance(items[item], str) and is_date(items[item]):
                        setattr(instance, item, parse(items[item]))
                    else:
                        setattr(instance, item, items[item])
                return instance
    
            with open("settings.json", "r", encoding="utf8") as file:
                return decoder(json.load(file), Settings)
    

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2014-06-11
      • 2012-02-08
      相关资源
      最近更新 更多