"""Custom json encoders for various purposes."""
import json
from uuid import UUID
from datetime import datetime
__ENCODERS__ = {
UUID: lambda obj: {"__type": "UUID", "__value": str(obj)},
datetime: lambda obj: {"__type": "DATETIME", "__value": obj.isoformat()}
}
class CustomJSONEncoder(json.JSONEncoder):
"""
A custom JSON encoder to handle cases where the default encoder fails.
"""
def default(self, obj):# pylint: disable=[arguments-renamed]
"""Return a serializable object for `obj`."""
if type(obj) in __ENCODERS__:
return __ENCODERS__[type(obj)](obj)
return json.JSONEncoder.default(self, obj)
__DECODERS__ = {
"UUID": UUID,
"DATETIME": datetime.fromisoformat
}
def custom_json_decoder(obj_dict):
"""Decode custom types"""
if "__type" in obj_dict:
return __DECODERS__[obj_dict["__type"]](obj_dict["__value"])
return obj_dict