One error that you might encounter in Python is:
TypeError: Object of type datetime is not JSON serializable
This error occurs when you try to serialize a datetime
object into a JSON string.
This tutorial will show you an example that causes this error and how I fix it in practice.
How to reproduce this error
Suppose you created a datetime
object using the datetime()
constructor as shown below:
from datetime import datetime
now = datetime.now()
Next, you include the now
object into a dictionary object and try to serialize that dictionary object using the json.dumps()
method:
import json
from datetime import datetime
now = datetime.now()
data = json.dumps({'created_at': now, 'user': 'Nathan'})
print(data)
But because json.dumps()
doesn’t support serializing a datetime
object, you get this error:
Traceback (most recent call last):
File "main.py", line 5, in <module>
data = json.dumps({'created_at': now, 'user': 'Nathan'})
...
TypeError: Object of type datetime is not JSON serializable
The Python JSON encoder class doesn’t know what to do when you pass a datetime
object in the data.
How to fix this error
To resolve this error, you need to specify the default
argument when passing a data with a datetime
object.
You probably want a string that represents the datetime
object, so put the default=str
argument in the json.dumps()
method as follows:
import json
from datetime import datetime
now = datetime.now()
json_obj = {'created_at': now, 'user': 'Nathan'}
data = json.dumps(json_obj, default=str)
print(data)
The default
argument accepts a function that will be applied to the data in case a TypeError
exception occurs when serializing the object.
As an alternative, you can also call the str()
function for the now
object when including it in the JSON object:
import json
from datetime import datetime
now = datetime.now()
json_obj = {'created_at': str(now), 'user': 'Nathan'}
data = json.dumps(json_obj)
print(data)
With the datetime
object converted into a string, the json.dumps()
method will have no problem serializing the data.
If you want to format the datetime
object, you can also use the strftime()
method, which returns a string from a datetime object in a specific format.
For example, to create a string of yyyy-mm-dd
format:
import json
from datetime import datetime
now = datetime.now()
dt_str = now.strftime("%Y-%m-%d")
json_obj = {'created_at': dt_str, 'user': 'Nathan'}
data = json.dumps(json_obj)
print(data)
Output:
{"created_at": "2023-05-09", "user": "Nathan"}
As you can see, the result string only contains the year, month, and date from the datetime
object as a string.
Conclusion
The Python TypeError: Object of type datetime is not JSON serializable
occurs when you try to serialize a datetime
object into a JSON string.
To resolve this error, you need to convert the datetime
object into a string yourself before passing it to the json.dumps()
method.
You can add a default=str
argument to the method, or you can use the datetime.strftime()
method to convert the datetime object into a string using a specific format.
Other similar errors when creating a JSON serializable include:
- TypeError: Object of type ndarray is not JSON serializable
- TypeError: Object of type function is not JSON serializable
You might want to read these tutorials to help you fix the object is not JSON serializable errors.
I hope this tutorial is helpful. See you again and happy coding! 👋