diff --git a/crates/target_python/output/basic_discriminator/__init__.py b/crates/target_python/output/basic_discriminator/__init__.py
index 0cdc4bcf..b4b98f49 100644
--- a/crates/target_python/output/basic_discriminator/__init__.py
+++ b/crates/target_python/output/basic_discriminator/__init__.py
@@ -71,6 +71,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/basic_enum/__init__.py b/crates/target_python/output/basic_enum/__init__.py
index 821b0ae6..657f5e9a 100644
--- a/crates/target_python/output/basic_enum/__init__.py
+++ b/crates/target_python/output/basic_enum/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/basic_properties/__init__.py b/crates/target_python/output/basic_properties/__init__.py
index fb295c93..97f71d20 100644
--- a/crates/target_python/output/basic_properties/__init__.py
+++ b/crates/target_python/output/basic_properties/__init__.py
@@ -47,6 +47,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/custom_overrides/__init__.py b/crates/target_python/output/custom_overrides/__init__.py
index af563f75..6054ccc7 100644
--- a/crates/target_python/output/custom_overrides/__init__.py
+++ b/crates/target_python/output/custom_overrides/__init__.py
@@ -53,6 +53,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/definition_name_collisions/__init__.py b/crates/target_python/output/definition_name_collisions/__init__.py
index 97f35d4b..41872627 100644
--- a/crates/target_python/output/definition_name_collisions/__init__.py
+++ b/crates/target_python/output/definition_name_collisions/__init__.py
@@ -78,6 +78,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/description/__init__.py b/crates/target_python/output/description/__init__.py
index 7ee31d91..cb204fd8 100644
--- a/crates/target_python/output/description/__init__.py
+++ b/crates/target_python/output/description/__init__.py
@@ -176,6 +176,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/discriminator_optional_properties/__init__.py b/crates/target_python/output/discriminator_optional_properties/__init__.py
index acaba501..e6bc17eb 100644
--- a/crates/target_python/output/discriminator_optional_properties/__init__.py
+++ b/crates/target_python/output/discriminator_optional_properties/__init__.py
@@ -59,6 +59,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/elements/__init__.py b/crates/target_python/output/elements/__init__.py
index 3f4a7a6e..1f853ed6 100644
--- a/crates/target_python/output/elements/__init__.py
+++ b/crates/target_python/output/elements/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/empty_and_nonascii_definitions/__init__.py b/crates/target_python/output/empty_and_nonascii_definitions/__init__.py
index b2a3146b..5bff5347 100644
--- a/crates/target_python/output/empty_and_nonascii_definitions/__init__.py
+++ b/crates/target_python/output/empty_and_nonascii_definitions/__init__.py
@@ -122,6 +122,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/empty_and_nonascii_enum_values/__init__.py b/crates/target_python/output/empty_and_nonascii_enum_values/__init__.py
index 72d61150..7aa2b9df 100644
--- a/crates/target_python/output/empty_and_nonascii_enum_values/__init__.py
+++ b/crates/target_python/output/empty_and_nonascii_enum_values/__init__.py
@@ -39,6 +39,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/empty_and_nonascii_properties/__init__.py b/crates/target_python/output/empty_and_nonascii_properties/__init__.py
index cf89866d..87aa7e20 100644
--- a/crates/target_python/output/empty_and_nonascii_properties/__init__.py
+++ b/crates/target_python/output/empty_and_nonascii_properties/__init__.py
@@ -59,6 +59,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/enum_collisions/__init__.py b/crates/target_python/output/enum_collisions/__init__.py
index 4aea4576..f1db68a1 100644
--- a/crates/target_python/output/enum_collisions/__init__.py
+++ b/crates/target_python/output/enum_collisions/__init__.py
@@ -77,6 +77,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/enum_variant_collisions/__init__.py b/crates/target_python/output/enum_variant_collisions/__init__.py
index f9efe435..0106d0c2 100644
--- a/crates/target_python/output/enum_variant_collisions/__init__.py
+++ b/crates/target_python/output/enum_variant_collisions/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/geojson/__init__.py b/crates/target_python/output/geojson/__init__.py
index 94b9a077..89361453 100644
--- a/crates/target_python/output/geojson/__init__.py
+++ b/crates/target_python/output/geojson/__init__.py
@@ -523,6 +523,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/initialisms/__init__.py b/crates/target_python/output/initialisms/__init__.py
index 23237c19..87427623 100644
--- a/crates/target_python/output/initialisms/__init__.py
+++ b/crates/target_python/output/initialisms/__init__.py
@@ -71,6 +71,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/keywords/__init__.py b/crates/target_python/output/keywords/__init__.py
index e4657501..1b941b57 100644
--- a/crates/target_python/output/keywords/__init__.py
+++ b/crates/target_python/output/keywords/__init__.py
@@ -63,6 +63,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_discriminator/__init__.py b/crates/target_python/output/nullable_discriminator/__init__.py
index b470a341..92cd337b 100644
--- a/crates/target_python/output/nullable_discriminator/__init__.py
+++ b/crates/target_python/output/nullable_discriminator/__init__.py
@@ -82,6 +82,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_elements/__init__.py b/crates/target_python/output/nullable_elements/__init__.py
index 88f8d0c7..5bd020b2 100644
--- a/crates/target_python/output/nullable_elements/__init__.py
+++ b/crates/target_python/output/nullable_elements/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_enum/__init__.py b/crates/target_python/output/nullable_enum/__init__.py
index 91a237d3..a801218e 100644
--- a/crates/target_python/output/nullable_enum/__init__.py
+++ b/crates/target_python/output/nullable_enum/__init__.py
@@ -46,6 +46,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_properties/__init__.py b/crates/target_python/output/nullable_properties/__init__.py
index 214400f8..8b56b9df 100644
--- a/crates/target_python/output/nullable_properties/__init__.py
+++ b/crates/target_python/output/nullable_properties/__init__.py
@@ -58,6 +58,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_references/__init__.py b/crates/target_python/output/nullable_references/__init__.py
index 0f59f18a..337d4137 100644
--- a/crates/target_python/output/nullable_references/__init__.py
+++ b/crates/target_python/output/nullable_references/__init__.py
@@ -119,6 +119,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/nullable_timestamp_property/__init__.py b/crates/target_python/output/nullable_timestamp_property/__init__.py
index ed3e8d17..58b29bce 100644
--- a/crates/target_python/output/nullable_timestamp_property/__init__.py
+++ b/crates/target_python/output/nullable_timestamp_property/__init__.py
@@ -38,6 +38,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/optional_properties/__init__.py b/crates/target_python/output/optional_properties/__init__.py
index 311ce3f3..1085c3ff 100644
--- a/crates/target_python/output/optional_properties/__init__.py
+++ b/crates/target_python/output/optional_properties/__init__.py
@@ -47,6 +47,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/property_name_collisions/__init__.py b/crates/target_python/output/property_name_collisions/__init__.py
index eeb38c81..3eb9b0f7 100644
--- a/crates/target_python/output/property_name_collisions/__init__.py
+++ b/crates/target_python/output/property_name_collisions/__init__.py
@@ -41,6 +41,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/reference/__init__.py b/crates/target_python/output/reference/__init__.py
index 141825fe..2c1b6781 100644
--- a/crates/target_python/output/reference/__init__.py
+++ b/crates/target_python/output/reference/__init__.py
@@ -67,6 +67,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_boolean/__init__.py b/crates/target_python/output/root_boolean/__init__.py
index df7cae52..bf90ad96 100644
--- a/crates/target_python/output/root_boolean/__init__.py
+++ b/crates/target_python/output/root_boolean/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_empty/__init__.py b/crates/target_python/output/root_empty/__init__.py
index e5b32213..6c32e875 100644
--- a/crates/target_python/output/root_empty/__init__.py
+++ b/crates/target_python/output/root_empty/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_float32/__init__.py b/crates/target_python/output/root_float32/__init__.py
index 78f01c9e..723440d4 100644
--- a/crates/target_python/output/root_float32/__init__.py
+++ b/crates/target_python/output/root_float32/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_float64/__init__.py b/crates/target_python/output/root_float64/__init__.py
index 78f01c9e..723440d4 100644
--- a/crates/target_python/output/root_float64/__init__.py
+++ b/crates/target_python/output/root_float64/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_int16/__init__.py b/crates/target_python/output/root_int16/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_int16/__init__.py
+++ b/crates/target_python/output/root_int16/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_int32/__init__.py b/crates/target_python/output/root_int32/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_int32/__init__.py
+++ b/crates/target_python/output/root_int32/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_int8/__init__.py b/crates/target_python/output/root_int8/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_int8/__init__.py
+++ b/crates/target_python/output/root_int8/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_nullable_string/__init__.py b/crates/target_python/output/root_nullable_string/__init__.py
index 2263e69c..eb01013b 100644
--- a/crates/target_python/output/root_nullable_string/__init__.py
+++ b/crates/target_python/output/root_nullable_string/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_nullable_timestamp/__init__.py b/crates/target_python/output/root_nullable_timestamp/__init__.py
index fbe3aa85..e4349ce8 100644
--- a/crates/target_python/output/root_nullable_timestamp/__init__.py
+++ b/crates/target_python/output/root_nullable_timestamp/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_string/__init__.py b/crates/target_python/output/root_string/__init__.py
index e9245c0a..c363a766 100644
--- a/crates/target_python/output/root_string/__init__.py
+++ b/crates/target_python/output/root_string/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_timestamp/__init__.py b/crates/target_python/output/root_timestamp/__init__.py
index 951c979a..227476b9 100644
--- a/crates/target_python/output/root_timestamp/__init__.py
+++ b/crates/target_python/output/root_timestamp/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_uint16/__init__.py b/crates/target_python/output/root_uint16/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_uint16/__init__.py
+++ b/crates/target_python/output/root_uint16/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_uint32/__init__.py b/crates/target_python/output/root_uint32/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_uint32/__init__.py
+++ b/crates/target_python/output/root_uint32/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/root_uint8/__init__.py b/crates/target_python/output/root_uint8/__init__.py
index 529804d2..988ea5f2 100644
--- a/crates/target_python/output/root_uint8/__init__.py
+++ b/crates/target_python/output/root_uint8/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/type_collisions/__init__.py b/crates/target_python/output/type_collisions/__init__.py
index fc7b01b7..04a9af94 100644
--- a/crates/target_python/output/type_collisions/__init__.py
+++ b/crates/target_python/output/type_collisions/__init__.py
@@ -86,6 +86,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/output/values/__init__.py b/crates/target_python/output/values/__init__.py
index 0eff71f6..98257808 100644
--- a/crates/target_python/output/values/__init__.py
+++ b/crates/target_python/output/values/__init__.py
@@ -34,6 +34,8 @@ def _to_json_data(data: Any) -> Any:
     if data is None or type(data) in [bool, int, float, str, object]:
         return data
     if type(data) is datetime:
+        if data.tzinfo == None:
+            return data.replace(tzinfo=timezone.utc).isoformat()
         return data.isoformat()
     if type(data) is list:
         return [_to_json_data(d) for d in data]
diff --git a/crates/target_python/src/lib.rs b/crates/target_python/src/lib.rs
index 1e91cb59..0f95f068 100644
--- a/crates/target_python/src/lib.rs
+++ b/crates/target_python/src/lib.rs
@@ -227,6 +227,8 @@ impl jtd_codegen::target::Target for Target {
                 )?;
                 writeln!(out, "        return data")?;
                 writeln!(out, "    if type(data) is datetime:")?;
+                writeln!(out, "        if data.tzinfo == None:")?;
+                writeln!(out, "            return data.replace(tzinfo=timezone.utc).isoformat()")?;
                 writeln!(out, "        return data.isoformat()")?;
                 writeln!(out, "    if type(data) is list:")?;
                 writeln!(out, "        return [_to_json_data(d) for d in data]")?;