Сериализация Enum в JSON

346 просмотра
0
0 Комментариев

Как сериализовать в JSON перечисление?

from enum import Enum
 
 
class Color(Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'
 
 
data = [
    {
        'name': 'car',
        'color': Color.RED,
    },
    {
        'name': 'dog',
        'color': Color.BLUE,
    },
]
 
import json
print(json.dumps(data, indent=4))

При выполнении dumps происходит ошибка: TypeError: is not JSON serializable


Добавить комментарий

2 Answers

Python Опубликовано 16.12.2018
0

Для решения этой проблемы нужно свой класс перечисления дополнительно наследовать от нужного типа, в данном случае от str, тогда при сериализации проблем не возникнет:

Для удобства можно завести для этого перечисление StrEnum и наследовать от него свои перечисления:

class StrEnum(str, Enum):
    pass
 
class Color(StrEnum):
    ...
 
class Currency(StrEnum):
    ...


Решение:

from enum import Enum
 
 
class Color(str, Enum):
    RED = 'red'
    GREEN = 'green'
    BLUE = 'blue'
 
data = [
    {
        'name': 'car',
        'color': Color.RED,
    },
    {
        'name': 'dog',
        'color': Color.BLUE,
    },
]
 
 
import json
print(json.dumps(data, indent=4))

Консоль:

[
    {
        "name": "car",
        "color": "red"
    },
    {
        "name": "dog",
        "color": "blue"
    }
]

Добавить комментарий
0

Чтобы поддерживать произвольные Enum, сохраняя их в JSON формате по имени:

>>> import json
>>> json.dumps(dict(color=Color.GREEN),
...            default=lambda obj: obj.name if isinstance(obj, Enum) else obj)
'{"color": "GREEN"}'

Это работает при произвольном определении Enum, к примеру:

from enum import Enum, auto
 
class Color(Enum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up