You should use 'settattr' method to set item into class and also create a Struct class to convert dict into class
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)