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

后端 未结 30 3362
梦谈多话
梦谈多话 2020-11-22 03:31

I have a basic dict as follows:

sample = {}
sample[\'title\'] = \"String\"
sample[\'somedate\'] = somedatetimehere
         


        
30条回答
  •  爱一瞬间的悲伤
    2020-11-22 03:45

    Updated for 2018

    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
    

    So, you may need to be careful about that in some cases.

提交回复
热议问题