Skip to content

Add deserializer for Enum #7

@kitschen

Description

@kitschen

You can add a generic serializer which works for all Enums like so

@JSONSerializer.register_serializer(Enum)
def Enum_serializer(obj: Enum) -> str:
    return obj.name

@JSONSerializer.register_deserializer(Enum)
def Enum_deserializer(cls, name: str) -> Enum:
    try:
        return cls[name]
    except KeyError:
        raise DeserializationError()

Maybe add this to default JSONSerializer or point to it in the docs?

Example test:

from dataclasses import dataclass
from enum import Enum, auto
from typing import Optional
from unittest import TestCase

from dataclasses_serialization.json import JSONSerializer
from dataclasses_serialization.serializer_base import DeserializationError


class Gender(Enum):
    male = auto()
    female = auto()

@dataclass(frozen=True)
class Employee:
    name: Optional[str]
    gender: Optional[Gender]


@JSONSerializer.register_serializer(Enum)
def Enum_serializer(obj: Enum) -> str:
    return obj.name


@JSONSerializer.register_deserializer(Enum)
def Enum_deserializer(cls, name: str) -> Enum:
    try:
        return cls[name]
    except KeyError:
        raise DeserializationError()


class TestEmployee(TestCase):
    def testSerializingNone(self):
        emp = Employee(None, None)
        resDict = JSONSerializer.serialize(emp)

        emp2 = JSONSerializer.deserialize(Employee, resDict)
        self.assertEqual(emp, emp2)


    def testSerializingValue(self):
        emp = Employee("Sarah", Gender.female)
        resDict = JSONSerializer.serialize(emp)

        emp2 = JSONSerializer.deserialize(Employee, resDict)
        self.assertEqual(emp, emp2)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions