serializer.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from __future__ import annotations
  2. import dataclasses
  3. import inspect
  4. import json
  5. from datetime import datetime, date
  6. class EnhancedJSONEncoder(json.JSONEncoder):
  7. """
  8. An improvement to the json.JSONEncoder class, which supports:
  9. encoding for dataclasses, encoding for datetime, and sets
  10. """
  11. def default(self, o: object) -> object:
  12. # Support encoding dataclasses
  13. # https://stackoverflow.com/a/51286749/7346633
  14. if dataclasses.is_dataclass(o):
  15. return dataclasses.asdict(o)
  16. # Support encoding datetime
  17. if isinstance(o, (datetime, date)):
  18. return o.isoformat()
  19. # Support for sets
  20. # https://stackoverflow.com/a/8230505/7346633
  21. if isinstance(o, set):
  22. return list(o)
  23. return super().default(o)
  24. def json_stringify(obj: object, indent: int | None = None) -> str:
  25. """
  26. Serialize json string with support for dataclasses and datetime and sets and with custom
  27. configuration.
  28. Preconditions:
  29. - obj != None
  30. :param obj: Objects
  31. :param indent: Indent size or none
  32. :return: Json strings
  33. """
  34. return json.dumps(obj, indent=indent, cls=EnhancedJSONEncoder, ensure_ascii=False)
  35. def from_dict(cls, d: dict):
  36. return cls(**{k: v for k, v in d.items() if k in inspect.signature(cls).parameters})