提问者:小点点

如何克服“DateTime.DateTime not JSON serializable”?


我有一个基本的口述如下:

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

当我尝试执行jsonify(sample)时,我得到:

TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable

我该怎么做才能使我的字典样本能够克服上面的错误?

注意:尽管可能不相关,但字典是从MongoDB中检索记录生成的,其中,当我打印出字符串(Sample['somedate'])时,输出为2012-08-08 21:46:24.862000


共1个答案

匿名用户

最初的回答采用了MongoDB“日期”字段的表示方式:

{“$date”:1506816000000}

如果您想要一个通用的Python解决方案来将datetime序列化为json,请查看@jjmontes的答案,以获得不需要依赖项的快速解决方案。

由于您正在使用mongoengine(每个注释),并且pymongo是一个依赖项,pymongo有内置的实用程序来帮助json序列化:
http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

示例用法(序列化):

from bson import json_util
import json

json.dumps(anObject, default=json_util.default)

示例用法(反序列化):

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

Django提供了一个本机的DjangoJsonEncoder序列化器,可以正确地处理这类问题。

参见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
)

我注意到DjangoJsonEncoder和使用自定义默认值之间的一个区别,如下所示:

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
)

Django删除了一些数据:

 "last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder 
 "last_login": "2018-08-03T10:51:42.990239", # default

所以,在某些情况下,你可能需要小心。