如何克服“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 2012-08-08 21:46:24.862000 str(sample['somedate']) 生成的.

原文由 Rolando 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 590
2 个回答

2018 年更新

原始答案适应了 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 和使用自定义 default 之间的一个区别,如下所示:

 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

因此,在某些情况下,您可能需要注意这一点。

原文由 jdi 发布,翻译遵循 CC BY-SA 4.0 许可协议

我的快速和肮脏的 JSON 转储会吃掉日期和所有东西:

 json.dumps(my_dictionary, indent=4, sort_keys=True, default=str)

default 是应用于不可序列化对象的函数。

在这种情况下它是 str ,所以它只是将它不知道的所有内容转换为字符串。这对于序列化非常有用,但在反序列化(因此“快速且肮脏”)时却不是那么好,因为任何东西都可能在没有警告的情况下被字符串化,例如函数或 numpy 数组。

原文由 jjmontes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题