Как только появляется какой-либо класс мы терпим фиаско с ошибкой что-то вроде
TypeError: Object of type MyClass is not JSON serializableПричём не поддерживаются даже стандартные классы типа datetime или re.Pattern 😢. Повезло лишь некоторым классам, которые предназначены для хранения данных, например namedtuple или defaultdict.
Как сделать так, чтобы любой объект смог сериализоваться в JSON?
Обычный подход это создать свой класс-сериализатор, где и будет прописан алгоритм превращения объектов в строку, словарь или что-то обычное для JSON
Допустим, у меня есть мой класс:
class MyClass:Создадим сериализатор который умеет понимать такой тип объекта. Его задача: сохранить имя типа и данные инстанса чтобы потом можно было восстановить объект обратно. Для этого переопределим метод default(), котоырй по умолчанию выбрасывает ошибку когда объект не поддерживается.
def __init__(self):
self.x = 100
class MySerializer(json.JSONEncoder):Пробуем закодировать объект в JSON используя мой сериализатор
def default(self, obj):
if isinstance(obj, MyClass):
return {'type': MyClass.__name__,
'data': obj.__dict__}
return super().default(obj)
>>> mc = MyClass()Отлично, теперь json понимает мой тип! 😎
>>> json.dumps(mc, cls=MySerializer)
'{"type": "MyClass", "data": {"x": 100}}'
#libs