]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🐛 Fix `jsonable_encoder` alters `json_encoders` of Pydantic v1 objects (#4972)
authorSalim Aboubacar <salimaboubacar@gmail.com>
Sat, 20 Sep 2025 17:57:18 +0000 (19:57 +0200)
committerGitHub <noreply@github.com>
Sat, 20 Sep 2025 17:57:18 +0000 (19:57 +0200)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
fastapi/encoders.py
tests/test_jsonable_encoder.py

index 0ad548b948ced6a98c16780ab41c3963e1a612a1..b037f8bb5eff4017d9f51e12c955fd84e92d0933 100644 (file)
@@ -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",
index 1906d6bf17c7eb163f717363e1dc47f69b9ac2cf..447c5b4d6a63ce0b5638bac4a74f99ff95eae767 100644 (file)
@@ -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():