0

How can create a python instance from Json?

I also tried namedtuple solution but you can't set field after create an instance from namedtuple

for example we have following class

class Settings:
    item1: int
    item2: list

    def __init__(self):
        self.item1 = 0
        self.item2 = []
AliReza Beigy
  • 559
  • 1
  • 8
  • 19

1 Answers1

2

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)
AliReza Beigy
  • 559
  • 1
  • 8
  • 19