diff --git a/fastapi/encoders.py b/fastapi/encoders.py index c9f882d2b..688021c3b 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -271,7 +271,11 @@ def jsonable_encoder( sqlalchemy_safe=sqlalchemy_safe, ) if isinstance(obj, Enum): - return obj.value + return jsonable_encoder( + obj.value, + custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, + ) if isinstance(obj, PurePath): return str(obj) if isinstance(obj, (str, int, float, type(None))): diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py index 8f8bd3fcb..bb3a380fe 100644 --- a/tests/test_jsonable_encoder.py +++ b/tests/test_jsonable_encoder.py @@ -1,7 +1,7 @@ import warnings from collections import deque from dataclasses import dataclass -from datetime import datetime, timezone +from datetime import date, datetime, timezone from decimal import Decimal from enum import Enum from math import isinf, isnan @@ -240,6 +240,31 @@ def test_custom_enum_encoders(): assert encoded_instance == custom_enum_encoder(instance) +def test_encode_enum_with_non_primitive_values(): + class DateEnum(Enum): + release = date(2024, 1, 1) + + class DecimalEnum(Enum): + half = Decimal("0.5") + + class BytesEnum(Enum): + data = b"data" + + assert jsonable_encoder(DateEnum.release) == "2024-01-01" + assert jsonable_encoder(DecimalEnum.half) == 0.5 + assert jsonable_encoder(BytesEnum.data) == "data" + + +def test_encode_enum_value_with_custom_encoder(): + class DateEnum(Enum): + release = date(2024, 1, 1) + + encoded_instance = jsonable_encoder( + DateEnum.release, custom_encoder={date: lambda o: o.strftime("%d/%m/%Y")} + ) + assert encoded_instance == "01/01/2024" + + def test_encode_model_with_pure_path(): class ModelWithPath(BaseModel): path: PurePath