Сериализация и десериализация Enum в JSON на Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того, чтобы преобразовать Enum в JSON, необходимо создать собственный класс-кодировщик на базе JSONEncoder из модуля json:

Python
Скопировать код
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)

Такой подход позволяет сериализовать элемент перечисления, представляя его значение как строковый литерал.

Кинга Идем в IT: пошаговый план для смены профессии

Обеспечение уникальности элементов с помощью Enum

Чтобы гарантировать уникальность элементов перечисления, используйте декоратор @unique. Он предотвращает повторение значений в Enum:

Python
Скопировать код
from enum import Enum, unique

@unique
class UniqueColor(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

Выбор метода сериализации

Переводите Enum в строку с помощью json.dumps, передав в него параметр default=str. Этот подход прост и доступен для Python 3.7 и новее:

Python
Скопировать код
json_str = json.dumps(UniqueColor.RED, default=str)  # Возвращает "1"

Для того, чтобы обеспечить числовое представление, используйте IntEnum, и Enum будет представлен в виде числа:

Python
Скопировать код
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:

Python
Скопировать код
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:

Python
Скопировать код
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 как упаковку вещей для отпуска:

Markdown
Скопировать код
- 🧳 Чемодан = **Enum**: вмещает все элементы перечисления.
- 👕 Предметы одежды = **Элементы Enum**: каждый из них представляет собой отдельный элемент перечисления.

Процесс сериализации:

Markdown
Скопировать код
1. 🖐️ Выбираем предмет.
2. 🔄 Складываем его.
3. 🏷️ Снабжаем меткой.
4. 🧳 Размещаем в чемодане.
  • Чемодан (🧳) символизирует JSON, в котором место найдут все элементы Enum.
  • Метки (🏷️) — это значения Enum, служащие идентификаторами для каждого предмета.

Полезные материалы

  1. enum — Поддержка перечислений — Документация Python 3.12.2: Официальное руководство по использованию Enum в Python.
  2. json — JSON кодировщик и декодер — Документация Python 3.12.2: Сведения о встроенном кодировщике и декодере JSON в Python.
  3. python – Сериализация элемента Enum в JSON – Stack Overflow: Обсуждение и решения для сериализации Enum на Stack Overflow.
  4. Учебник | DigitalOcean: Всё, что нужно знать об использовании Enum в Python 3.
  5. Сериализация Python Enum в JSON: Примеры сериализации Enum на GitHub Gist.