TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #188

@pythonotes

Python Заметки

Прегледи1,270Број на прегледи
Објавено7 дек.07.12.2020 г., 09:00
Содржина

Содржина на објавата

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