From: Salim Aboubacar Date: Sat, 20 Sep 2025 17:57:18 +0000 (+0200) Subject: 🐛 Fix `jsonable_encoder` alters `json_encoders` of Pydantic v1 objects (#4972) X-Git-Tag: 0.117.0~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2dc769b12174b0f7ad5c2ac16419fc4027ad8372;p=thirdparty%2Ffastapi%2Ffastapi.git 🐛 Fix `jsonable_encoder` alters `json_encoders` of Pydantic v1 objects (#4972) Co-authored-by: Sebastián Ramírez Co-authored-by: Yurii Motov --- diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 0ad548b94..b037f8bb5 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -219,7 +219,7 @@ def jsonable_encoder( if not PYDANTIC_V2: encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined] if custom_encoder: - encoders.update(custom_encoder) + encoders = {**encoders, **custom_encoder} obj_dict = _model_dump( obj, mode="json", diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py index 1906d6bf1..447c5b4d6 100644 --- a/tests/test_jsonable_encoder.py +++ b/tests/test_jsonable_encoder.py @@ -216,9 +216,12 @@ def test_custom_encoders(): instance = MyModel(dt_field=safe_datetime.now()) encoded_instance = jsonable_encoder( - instance, custom_encoder={safe_datetime: lambda o: o.isoformat()} + instance, custom_encoder={safe_datetime: lambda o: o.strftime("%H:%M:%S")} ) - assert encoded_instance["dt_field"] == instance.dt_field.isoformat() + assert encoded_instance["dt_field"] == instance.dt_field.strftime("%H:%M:%S") + + encoded_instance2 = jsonable_encoder(instance) + assert encoded_instance2["dt_field"] == instance.dt_field.isoformat() def test_custom_enum_encoders():