将 JSON 转换为类 [重复]

Posted

技术标签:

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

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

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

例如我们有以下类

class Settings:
    item1: int
    item2: list

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

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于将 JSON 转换为类 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(79): 将JSON字符串转换为类实例

Python爬虫编程思想(79): 将JSON字符串转换为类实例

Angular 5 / Typescript - 如何将复杂的 json 对象转换为类

GSON将json转换为类对象

构建 Kotlin 类以使用 Gson 将 json 响应转换为类

将字符串转换为类对象 [关闭]