【问题标题】:How does Python JSON library dealing with time?Python JSON 库如何处理时间?
【发布时间】:2017-04-01 21:30:21
【问题描述】:

所以我目前正在学习 MongoDB,我使用的是 PyMongo 而不是 MongoDB shell。

当我开始尝试基本的 CRUD 操作时,我发现使用 PyMongo 加载 bios 数据很困难,因为发布在 website 上的原始数据对于 time 有一个奇怪的 ISODATA

原来的 python JSON 库似乎不支持这个,mongoimport 似乎也不支持这个(不确定)。但是我发现this,修改成{$date:"2017-04-01T05:00:00Z"}后,mongoimport就可以了。

现在我正在使用subprocess 调用外部命令来导入数据。所以我的问题是,如何使用python正确读取JSON数据并使用PyMongo插入数据。

详情

mongodb 文档中的bios 数据如下所示

{
"_id" : 1,
"name" : {
    "first" : "John",
    "last" : "Backus"
},
"birth" : ISODate("1924-12-03T05:00:00Z"),
"death" : ISODate("2007-03-17T04:00:00Z"),
"contribs" : [
    "Fortran",
    "ALGOL",
    "Backus-Naur Form",
    "FP"
],
"awards" : [
    {
        "award" : "W.W. McDowell Award",
        "year" : 1967,
        "by" : "IEEE Computer Society"
    },
    {
        "award" : "National Medal of Science",
        "year" : 1975,
        "by" : "National Science Foundation"
    },
    {
        "award" : "Turing Award",
        "year" : 1977,
        "by" : "ACM"
    },
    {
        "award" : "Draper Prize",
        "year" : 1993,
        "by" : "National Academy of Engineering"
    }
]
}

当我尝试使用 Python 的 JSON 库解析它时,由于"birth" : ISODate("1924-12-03T05:00:00Z"), 而收到错误消息json.decoder.JSONDecodeError。而mongoimport 也因为同样的原因无法解析。

当我修改时,

"birth" : ISODate("1924-12-03T05:00:00Z"),进入

"birth" : $date:"2017-04-01T05:00:00Z"

mongoimport 正在工作,但 python 仍然无法解析它。

我在这里要问的是一种在 Python 和 PyMongo 中处理这个问题的方法,而不是调用外部命令。

【问题讨论】:

  • 请分享一个如何您尝试使用 pymongo 插入数据的示例。

标签: python json mongodb pymongo


【解决方案1】:

您正在查看的示例可能打算在 mongo shell 中使用,其中可以解析 ISODate bson 类型的使用,如图所示。

除此之外,我们面临的挑战是 JSON 没有日期数据类型,也没有表示日期的标准方式。为了应对这一挑战,MongoDB 创建了一个名为 Extended JSON 的东西,它可以用 JSON 编码日期,类似于您使用 $date 显示的方式。

为了在 Python / PyMongo 中使用扩展 JSON,您可以使用 json_util

这是一个简短的例子:

from bson.json_util import loads
from pymongo import MongoClient

json = '''
{
    "_id" : 1,
    "name" : {
        "first" : "John",
        "last" : "Backus"
    },
    "birth" : {"$date":"2017-04-01T05:00:00.000Z"},
    "death" : {"$date":"2017-04-01T05:00:00.000Z"}
}
'''

bson = loads(json)
print(str(bson))
db = MongoClient().test
collection = db.bios
collection.insert(bson)

【讨论】:

猜你喜欢
  • 2014-07-16
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多