diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 26ceb21445f15..3f5b79d9ebbce 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -71,6 +71,8 @@ def jsonable_encoder( by_alias=by_alias, skip_defaults=bool(exclude_unset or skip_defaults), ) + if "__root__" in obj_dict: + obj_dict = obj_dict["__root__"] return jsonable_encoder( obj_dict, exclude_none=exclude_none, diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py index adee443a8943c..d4ae3444211d8 100644 --- a/tests/test_jsonable_encoder.py +++ b/tests/test_jsonable_encoder.py @@ -76,6 +76,10 @@ class ModelWithDefault(BaseModel): bla: str = "bla" +class ModelWithRoot(BaseModel): + __root__: str + + @pytest.fixture( name="model_with_path", params=[PurePath, PurePosixPath, PureWindowsPath] ) @@ -158,3 +162,8 @@ def test_encode_model_with_path(model_with_path): else: expected = "/foo/bar" assert jsonable_encoder(model_with_path) == {"path": expected} + + +def test_encode_root(): + model = ModelWithRoot(__root__="Foo") + assert jsonable_encoder(model) == "Foo"