How to overcome “datetime.datetime not JSON serializable”?

How to overcome “datetime.datetime not JSON serializable”?

Asked on October 13, 2018 in Python.
Add Comment


  • 6 Answer(s)

    My quick & dirty JSON dump that eats dates and everything:

    json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)
    
    Answered on October 15, 2018.
    Add Comment
    import datetime
    import json
    def default(o):
    if isinstance(o, (datetime.date, datetime.datetime)):
    return o.isoformat()
    return json.dumps(
    item,
    sort_keys=True,
    indent=1,
    default=default
    
    Answered on December 16, 2018.
    Add Comment

    the given code is

    from datetime import datetime
    def json_serial(obj):
    
    """JSON serializer for objects not serializable by default json code"""
    if isinstance(obj, datetime):
    
    serial = obj.isoformat()
    
    return serial
    
    raise TypeError ("Type not serializable")
    
    Answered on December 16, 2018.
    Add Comment
    def default(obj):
        """Default JSON serializer."""
        import calendar, datetime
    
        if isinstance(obj, datetime.datetime):
            if obj.utcoffset() is not None:
                obj = obj - obj.utcoffset()
            millis = int(
                calendar.timegm(obj.timetuple()) * 1000 +
                obj.microsecond / 1000
            )
            return millis
        raise TypeError('Not sure how to serialize %s' % (obj,))
    
    

    Then use it like so:

    import datetime, json
    print json.dumps(datetime.datetime.now(), default=default)

    output:

    '1365091796124'
    Answered on January 14, 2019.
    Add Comment

    The original answer accommodated the way MongoDB “date” fields were represented as:

    {“$date”: 1506816000000}

    If you want a generic Python solution for serializing datetime to json, check out @jjmontes’ answer for a quick solution which requires no dependencies.

    As you are using mongoengine (per comments) and pymongo is a dependency, pymongo has built-in utilities to help with json serialization:
    http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

    Example usage (serialization):

    from bson import json_util
    import json

    json.dumps(anObject, default=json_util.default)
    Example usage (deserialization):

    json.loads(aJsonString, object_hook=json_util.object_hook)

    Answered on February 4, 2019.
    Add Comment

    The original answer accommodated the way MongoDB “date” fields were represented as:

    {"$date": 1506816000000}

    If you want a generic Python solution for serializing datetime to json, check out @jjmontes’ answer for a quick solution which requires no dependencies.


    As you are using mongoengine (per comments) and pymongo is a dependency, pymongo has built-in utilities to help with json serialization:
    http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

    Example usage (serialization):

    from bson import json_util
    import json
    
    json.dumps(anObject, default=json_util.default)

    Example usage (deserialization):

    json.loads(aJsonString, object_hook=json_util.object_hook)

    Django

    Django provides a native DjangoJSONEncoder serializer that deals with this kind of properly.

    See https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder

    from django.core.serializers.json import DjangoJSONEncoder
    
    return json.dumps(
      item,
      sort_keys=True,
      indent=1,
      cls=DjangoJSONEncoder
    )

    One difference I’ve noticed between DjangoJSONEncoder and using a custom default like this:

    import datetime
    import json
    
    def default(o):
        if isinstance(o, (datetime.date, datetime.datetime)):
            return o.isoformat()
    
    return json.dumps(
      item,
      sort_keys=True,
      indent=1,
      default=default
    )

    Is that Django strips a bit of the data:

     "last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder 
     "last_login": "2018-08-03T10:51:42.990239", # default
    Answered on February 9, 2019.
    Add Comment


  • Your Answer

    By posting your answer, you agree to the privacy policy and terms of service.