当前位置: 首页 > 面试题库 >

Python-如何克服“ datetime.datetime无法JSON序列化”?

南宫正阳
2023-03-14
问题内容

我有一个基本的命令,如下所示:

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

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

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

我该怎么做才能使我的词典示例可以克服上述错误?

注意:虽然可能不相关,但字典是从mongodb中检索记录生成的,在我打印输出时str(sample['somedate']),输出为2020-08-08 21:46:24.862000。


问题答案:

原始答案适应了MongoDB“日期”字段表示为:

{"$date": 1506816000000}

如果你希望使用通用的Python解决方案序列化为datetimejson,请查看@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

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

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



 类似资料:
  • 问题内容: 我有一个基本的命令,如下所示: 当我尝试做时,我得到: 我该怎么做才能使我的字典示例可以克服上述错误? 注意: 尽管可能无关紧要,但是字典是从记录的检索中生成的,这些记录是在我打印出来的地方输出的。 问题答案: 原始答案适应了MongoDB“日期”字段表示为: 如果您希望使用通用的Python解决方案序列化为json,请查看@jjmontes的答案以获取无需依赖项的快速解决方案。 当您

  • 我有一个基本的口述如下: 当我尝试执行时,我得到: 我该怎么做才能使我的字典样本能够克服上面的错误? 注意:尽管可能不相关,但字典是从中检索记录生成的,其中,当我打印出时,输出为。

  • 我在Python中有一个类,用于检索表中的所有列,并返回包含此数据的JSON。 问题是这些列中至少有一列是datetime,我似乎不知道如何序列化这些列以便生成有效的JSON。 我的班级如下: 有什么线索吗?

  • 问题内容: 我需要将日期转换为Excel序列号,以用于编写的数据处理脚本。通过在OpenOffice Calc工作簿中使用日期,我可以推断出“ 1-Jan 1899 00:00:00”映射到数字零。 我编写了以下函数,以将python datetime对象转换为Excel序列号: 但是,当我尝试一些示例日期时,数字与在Excel(以及OpenOffice Calc)中将日期格式设置为数字时得到的数

  • 我正在学习Python和aws。 我想要的是从JSON响应中提取值。此代码适用于不包含日期值的JSON响应,但在本例中,响应包含日期值。 这是我的密码: 我得到了这个错误: 有人知道解决办法吗?thx

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。