将 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 对象转换为类