TypeError: datetime.datetime() 不是 JSON 可序列化的

Posted

技术标签:

【中文标题】TypeError: datetime.datetime() 不是 JSON 可序列化的【英文标题】:TypeError: datetime.datetime() is not JSON serializable 【发布时间】:2017-10-24 19:19:43 【问题描述】:

我对 MongoDB 中的时间戳有疑问。

所以情况是这样的:

我读入了 json 并为它们添加了时间戳:

my_json['insertTime'] = datetime.datetime.now()
mongodb.collection.insert_one(my_json)

会产生这样的数据库:

"insertTime" : ISODate("2017-05-24T12:39:34.844Z")

在我从数据库中读取它并尝试将相同的文档写入另一个 mongoDB 表后,我收到以下错误:

TypeError: datetime.datetime(2017, 5, 24, 12, 39, 46, 671000) is not JSON serializable

我已经阅读了将日期时间转换为字符串值的解决方案,但我希望它采用 ISODate 格式,就像第一个表中一样。

这就是从表 A 中获取时间戳后的样子:

'insertTime': datetime.datetime(2017, 5, 24, 12, 39, 46, 671000)

我应该怎么做才能将它插入到具有相同格式(ISODate)的第二个表中?

PS:我将数据加载到表B中的方式如下:

tableB.insert_one(json.loads(json.dumps(docFromTableA)))

【问题讨论】:

【参考方案1】:

无需通过 JSON 表示即可将文档保存到 MongoDB。做吧:

tableB.insert_one(docFromTableA)

MongoDB 的原生数据格式不是 JSON,它是 BSON,一种比 JSON 类型多得多的二进制结构。 PyMongo 自动在 BSON 和 Python 字典之间转换 MongoDB 文档。

【讨论】:

以上是关于TypeError: datetime.datetime() 不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

报错解决DateTimeField *** received a naive datetime (***) while time zone support is active

笔记(用Python做些事情)--变量(日期和时间)

查找多行中连续日期的开始和结束日期

格式化日期时间标签以包含熊猫图的工作日名称

Python3.x:日期库dateutil简介

TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代