python - 将 JSON 转换为类
问题描述
如何从 Json 创建 python 实例?
我也尝试过 namedtuple 解决方案,但在从 namedtuple 创建实例后无法设置字段
例如我们有以下课程
class Settings:
item1: int
item2: list
def __init__(self):
self.item1 = 0
self.item2 = []
解决方案
您应该使用 '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)
推荐阅读
- python - 在 Windows 2016 Server 上使用 wmi 和 python 获取 ATAPISmartData
- html - 如何在输入元素中垂直居中文本?
- python - 绘制(绘图)一个完整的系列(数据框),甚至在线类型上不存在中间值
- angular - 当我在 ngOnInit() 中使用 router.getCurrentNavigation() 时,它会给我类型错误,但是当我在构造函数中使用它时,它工作正常,为什么?
- python - 脚本运行时 file_counter 没有更新,我希望 file_counter 更新以便可以创建一个新的 csv 文件
- javascript - 如何使用 jQuery 前端保存和获取大 json
- r - 使用 purrr::map() 将模型拟合到新列表列时,如果拟合错误,则返回指示性字符串
- java - JPanel 类型的方法未定义
- azure - 在 Azure 上部署战争文件
- java - 为什么Java WeakReference会出现OutOfMemoryError?