如何克服“datetime.datetime not JSON serializeable”?

2022-09-05 01:04:47

我有一个基本命令如下:

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

当我尝试这样做时,我得到:jsonify(sample)

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

我能做些什么来使我的字典示例可以克服上面的错误?

注意:虽然它可能不相关,但字典是从我打印出来时从哪里检索记录生成的,输出是。mongodbstr(sample['somedate'])2012-08-08 21:46:24.862000


答案 1

我的快速和肮脏的JSON转储,吃日期和一切:

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

default是应用于不可序列化对象的函数。
在本例中,它是 ,因此它只是将它不知道的所有内容转换为字符串。这对于序列化来说很好,但在反序列化时就不那么好了(因此是“快速和肮脏”),因为任何东西都可能在没有警告的情况下被字符串化,例如函数或numpy数组。str


答案 2

基于其他答案,基于特定序列化程序的简单解决方案,该序列化程序仅将和对象转换为字符串。datetime.datetimedatetime.date

from datetime import date, datetime

def json_serial(obj):
    """JSON serializer for objects not serializable by default json code"""

    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    raise TypeError ("Type %s not serializable" % type(obj))

如您所见,代码只是检查对象是否属于类 或 ,然后根据 ISO 8601 格式 YYYY-MM-DDTHH:MM:SS(很容易被 JavaScript 解码)来生成它的序列化版本。如果寻求更复杂的序列化表示,则可以使用其他代码代替str()(有关示例,请参阅此问题的其他答案)。代码以引发异常结束,以处理使用不可序列化类型调用它的情况。datetime.datetimedatetime.date.isoformat()

此json_serial函数可按如下方式使用:

from datetime import datetime
from json import dumps

print dumps(datetime.now(), default=json_serial)

有关 json.dump 的默认参数如何工作的详细信息,请参阅 json 模块文档的基本用法部分