Table of Contents
ToggleWhen we attempt to serialize a Python datetime object to JSON. We get TypeError: Object of type datetime is not JSON serializable problem. This is because the JSON module does not support the object from the datetime module.
To solve this problem we need to convert datetime object to a string format using JSON module that can be serialized.
When does "object of type datetime is not json serializable" in python occur ?
JSON stands for javascript object notation which is a lightweight data interchange format. JSON only supports basic datatypes such as strings, numbers, booleans, arrays, and dictionaries. JSON by default doesn’t support representation of complex objects like datetime.
When we attempt to serialize a datetime object directly into JSON we get an error. we will show you two examples where an object of type datetime is not JSON serializable error occurs
I have created an empty dictionary called “event_details” which contains two keys title and time. The time key is storing the current datetime. When we try to serialize the data using json.dumps() function we get an error.
import datetime
import json
event_details = {}
event_details['title'] = "Error"
event_details['time'] =datetime.datetime.now()
json_data = json.dumps(event_details)
import json
from datetime import datetime
data = {
"timestamp": datetime.now()
}
json_data = json.dumps(data)
Error we get
TypeError Traceback (most recent call last)
Cell In[6], line 8
5 event_details['title'] = "Error"
6 event_details['time'] =datetime.datetime.now()
----> 8 json_data = json.dumps(event_details)
in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
226 # cached encoder
227 if (not skipkeys and ensure_ascii and
228 check_circular and allow_nan and
229 cls is None and indent is None and separators is None and
230 default is None and not sort_keys and not kw):
--> 231 return _default_encoder.encode(obj)
232 if cls is None:
233 cls = JSONEncoder
in JSONEncoder.encode(self, o)
195 return encode_basestring(o)
196 # This doesn't pass the iterator directly to ''.join() because the
197 # exceptions aren't as detailed. The list call should be roughly
198 # equivalent to the PySequence_Fast that ''.join() would do.
--> 199 chunks = self.iterencode(o, _one_shot=True)
200 if not isinstance(chunks, (list, tuple)):
201 chunks = list(chunks)
...
178 """
--> 179 raise TypeError(f'Object of type {o.__class__.__name__} '
180 f'is not JSON serializable')
TypeError: Object of type datetime is not JSON serializable
How to solve object of type datetime is not json serializable in python ?
We have two ways to solve this error.
- Convert datetime to string .
- Custom JSON encoder.
Convert datetime to string using strftime() method
import datetime
import json
dt_now = datetime.datetime.now()
cus_date=dt_now.strftime("%Y-%m-%dT%H:%M:%SZ")
event={'name':'error','time':cus_date}
json_string = json.dumps(event)
print(json_string)
output
{"name": "error", "time": "2024-05-20T14:04:53Z"}
Convert datetime to string using isoformat() method
import datetime
import json
dt_now = datetime.datetime.now()
json_string = json.dumps({'time':dt_now.isoformat()})
print(json_string)
Output
{"time": "2024-05-20T14:21:43.326789"}
Using 'default' parameter in json.dumps() function
import datetime
import json
dt_now = datetime.datetime.now()
event={'name':'error solved','time':dt_now}
json_string = json.dumps(event, default=str)
print(json_string)
Output
'{"name": "error solved", "time": "2024-05-20 15:01:04.245225"}'
Custom JSON encoder
import datetime
import json
class DateEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
# Data to be serialized
data = {"name": "Mangesh", "date": datetime.datetime(2023, 5, 20)}
# custom encoder
json_data = json.dumps(data, cls=DateEncoder)
print(json_data)
Output
{"name": "Mangesh", "date": "2023-05-20T00:00:00"}
The class DateEncoder inherits from json.JSONEncoder. We are overriding the ‘default’ function from json.JSONEncoder.default(). Inside that function, we check for whether the object is datetime type. If yes, then we convert the datetime object to string using isoformat() function. If the object is not a datetime object then we call json.JSONEncoder.default() function with the object to handle the necessary serialization.
DjangoJSONEncoder for Serialization
import json
import datetime
from django.core.serializers.json import DjangoJSONEncoder
task = {
"id": 123,
"title": "Complete project",
"deadline": datetime.datetime(2024, 5, 20, 18, 0, 0)
}
# Serialize the dictionary using DjangoJSONEncoder
serialized_task = json.dumps(task, cls=DjangoJSONEncoder)
print(f"Serialized JSON data: \n {serialized_task}")
Output
Serialized JSON data:
{"id": 123, "title": "Complete project",
"deadline": "2024-05-20T18:00:00"}
Conclusion
In this blog, we learned how to make a datetime object JSON serializable in Python by using the JSON module. You can also explore the difference between continue and pass.




Pingback: How to write a list to a file in python -
Pingback: How To Use Lambda Function In List Comprehension In Python -