serializer.py 1.2 KB

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