我有一个基本的字典如下:
sample = {} sample['title'] = "String" sample['somedate'] = somedatetimehere
当我尝试这样做时,jsonify(sample)我得到:
jsonify(sample)
TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable
我该怎么做才能使我的字典样本能够克服上述错误?
注意: 虽然可能不相关,但字典是通过检索记录生成的mongodb,当我打印出来时str(sample['somedate']),输出是2012-08-08 21:46:24.862000。
mongodb
str(sample['somedate'])
2012-08-08 21:46:24.862000
原始答案适应了 MongoDB“日期”字段的表示方式:
{"$date": 1506816000000}
如果您想要一个用于序列化为datetimejson 的通用 Python 解决方案,请查看@jjmontes 的答案以获得不需要依赖项的快速解决方案。
datetime
当您使用 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序列化程序,可以正确处理这种情况。
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:
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
因此,在某些情况下,您可能需要注意这一点。