from datetime import date, datetime from typing import Any, List, Type, TypeVar import marshmallow_dataclass from flask.json import JSONEncoder from marshmallow import Schema class DataclassDictionaryEncoder: @staticmethod def convert_to_dict(data: Any) -> dict or List[dict]: if data is None: return None is_response_array = isinstance(data, list) if is_response_array and len(data) == 0: return [] if is_response_array: dataclass_type = type(data[0]) else: dataclass_type = type(data) schema = marshmallow_dataclass.class_schema(dataclass_type)(many=is_response_array) return schema.dump(data) T = TypeVar("T") class DataclassDictionaryDecoder: @staticmethod def convert_from_dict(model_class: Type[T], data: dict) -> T: schema = marshmallow_dataclass.class_schema(model_class, base_schema=Schema) schema = schema(many=False) return schema.load(data) class CustomJSONEncoder(JSONEncoder): """Formatter for json serializing.""" def default(self, obj): """Format date and time in ISO 8601 format.""" if isinstance(obj, (date, datetime)): return obj.isoformat() return str(obj)