首页 > 解决方案 > 将 JSON 转换为类

问题描述

如何从 Json 创建 python 实例?

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

例如我们有以下课程

class Settings:
    item1: int
    item2: list

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

标签: pythonjson

解决方案


您应该使用 'setattr' 方法将项目设置为类,并创建一个 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)

推荐阅读