Search code examples
pythonjsonserializationsimplejson

Why does JSON serialization of datetime objects in Python not work out of the box for datetime objects?


Why does the JSON serialization not work for datetime objects? As I understand JSON serialization, the basic idea for any object can be called the __str__ built-in function and then URL encode the object that you get as a response. But in case of datetime, I get the following error

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

while there is a __str__, i.e., a way of stringifying the object already available , But it seems like a conscious decision to not do it , why would that be the case?


Solution

  • No, it doesn't work that way in the json module. The module provides you with a default encoder: json.JSONEncoder. You need to extend this to provide your implementation of default method to serialize objects. Something like this:

    import json
    import datetime
    from time import mktime
    
    class MyEncoder(json.JSONEncoder):
    
        def default(self, obj):
            if isinstance(obj, datetime.datetime):
                return int(mktime(obj.timetuple()))
    
            return json.JSONEncoder.default(self, obj)
    
    print json.dumps(obj, cls=MyEncoder)
    

    As others correctly pointed out, the reason is that the standard for JSON does not specify how date time can be represented.