diff --git a/fastapi/encoders.py b/fastapi/encoders.py index c9f882d2ba..ea6c4ea6d3 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -280,11 +280,13 @@ def jsonable_encoder( return None if isinstance(obj, dict): encoded_dict = {} - allowed_keys = set(obj.keys()) - if include is not None: - allowed_keys &= set(include) - if exclude is not None: - allowed_keys -= set(exclude) + allowed_keys: set[Any] | None = None + if include is not None or exclude is not None: + allowed_keys = set(obj.keys()) + if include is not None: + allowed_keys &= set(include) + if exclude is not None: + allowed_keys -= set(exclude) for key, value in obj.items(): if ( ( @@ -293,7 +295,7 @@ def jsonable_encoder( or (not key.startswith("_sa")) ) and (value is not None or not exclude_none) - and key in allowed_keys + and (allowed_keys is None or key in allowed_keys) ): encoded_key = jsonable_encoder( key, diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py index c23a9e5d79..a542c02c65 100644 --- a/tests/test_jsonable_encoder.py +++ b/tests/test_jsonable_encoder.py @@ -82,6 +82,9 @@ def test_encode_dict(): "name": "Firulais", "owner": {"name": "Foo"}, } + assert jsonable_encoder(pet, include={"name", "owner"}, exclude={"owner"}) == { + "name": "Firulais" + } def test_encode_dict_include_exclude_list():