The error “TypeError: Object of type datetime is not JSON serializable” occurs when you try to serialize a Python datetime
object into JSON format using json.dumps()
. The json
module does not natively support datetime
objects.
Fixing the Error: Step-by-Step Solutions
1. Convert datetime
to String (Recommended)
Use isoformat()
to convert datetime
to a string before serialization:
import json
from datetime import datetime
data = {"timestamp": datetime.now()}
# Convert datetime to string
data["timestamp"] = data["timestamp"].isoformat()
json_data = json.dumps(data)
print(json_data)
Output (ISO format):
{"timestamp": "2025-03-12T14:30:45.678900"}
2. Use a Custom JSON Encoder
If you frequently deal with datetime
objects, create a custom encoder:
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
json_data = json.dumps(data, cls=DateTimeEncoder)
print(json_data)
3. Manually Convert datetime
Before Encoding
Modify your data dictionary before passing it to json.dumps()
:
data = {"timestamp": str(datetime.now())} # Convert to string
json_data = json.dumps(data)
print(json_data)
4. Use orjson
(Fast Alternative)
If performance is a concern, use orjson
, which supports datetime
natively:
import orjson
data = {"timestamp": datetime.now()}
json_data = orjson.dumps(data).decode()
print(json_data)
Summary of Solutions
Method | Code Example | Output |
---|---|---|
Convert to String | data["timestamp"] = datetime.now().isoformat() | "2025-03-12T14:30:45.678900" |
Custom Encoder | json.dumps(data, cls=DateTimeEncoder) | "2025-03-12T14:30:45.678900" |
Manual Conversion | str(datetime.now()) | "2025-03-12 14:30:45.678900" |
Use orjson | orjson.dumps(data).decode() | "2025-03-12T14:30:45.678900" |