Сериализация и десериализация Enum в JSON на Python
Быстрый ответ
Для того, чтобы преобразовать Enum в JSON, необходимо создать собственный класс-кодировщик на базе JSONEncoder
из модуля json
:
import json
from enum import Enum
# Определение Enum
class Color(Enum):
RED = 'красный'
GREEN = 'зелёный'
BLUE = 'синий'
# Кодировщик Enum
class EnumEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Enum):
return obj.value
return super().default(obj)
# Сериализация
json_str = json.dumps(Color.RED, cls=EnumEncoder)
Такой подход позволяет сериализовать элемент перечисления, представляя его значение как строковый литерал.
Обеспечение уникальности элементов с помощью Enum
Чтобы гарантировать уникальность элементов перечисления, используйте декоратор @unique
. Он предотвращает повторение значений в Enum:
from enum import Enum, unique
@unique
class UniqueColor(Enum):
RED = 1
GREEN = 2
BLUE = 3
Выбор метода сериализации
Переводите Enum в строку с помощью json.dumps
, передав в него параметр default=str
. Этот подход прост и доступен для Python 3.7 и новее:
json_str = json.dumps(UniqueColor.RED, default=str) # Возвращает "1"
Для того, чтобы обеспечить числовое представление, используйте IntEnum
, и Enum будет представлен в виде числа:
from enum import IntEnum
class Color(IntEnum):
RED = 1
GREEN = 2
BLUE = 3
json_str = json.dumps(Color.RED) # Возвращает "1"
Волшебство lambda
Применяйте функцию lambda в json.dumps
для лаконичной сериализации значения Enum:
json_str = json.dumps(Color.RED, default=lambda x: x.value if isinstance(x, Enum) else str(x))
Декодирование Enums из JSON
Функция as_enum
Создайте функцию as_enum
для обратного удобного преобразования JSON в Enum:
def as_enum(enum_class, value):
if value in enum_class._value2member_map_:
return enum_class(value)
return value
color = as_enum(Color, 'RED') # Преобразуется в Color.RED
Точность сериализации
Чтобы обеспечить точность сериализации Enum, выбирайте подходящий сериализатор, который будет корректно обрабатываться при обратном преобразовании.
Визуализация
Можно представить сериализацию элемента Enum в JSON как упаковку вещей для отпуска:
- 🧳 Чемодан = **Enum**: вмещает все элементы перечисления.
- 👕 Предметы одежды = **Элементы Enum**: каждый из них представляет собой отдельный элемент перечисления.
Процесс сериализации:
1. 🖐️ Выбираем предмет.
2. 🔄 Складываем его.
3. 🏷️ Снабжаем меткой.
4. 🧳 Размещаем в чемодане.
- Чемодан (🧳) символизирует JSON, в котором место найдут все элементы Enum.
- Метки (🏷️) — это значения Enum, служащие идентификаторами для каждого предмета.
Полезные материалы
- enum — Поддержка перечислений — Документация Python 3.12.2: Официальное руководство по использованию Enum в Python.
- json — JSON кодировщик и декодер — Документация Python 3.12.2: Сведения о встроенном кодировщике и декодере JSON в Python.
- python – Сериализация элемента Enum в JSON – Stack Overflow: Обсуждение и решения для сериализации Enum на Stack Overflow.
- Учебник | DigitalOcean: Всё, что нужно знать об использовании Enum в Python 3.
- Сериализация Python Enum в JSON: Примеры сериализации Enum на GitHub Gist.