gpt4 book ai didi

python - 如何在 Python 中读取包含 ObjectId 和 ISODate 的 json 文件?

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:49 24 4
gpt4 key购买 nike

我想读取一个包含 ObjectId 和 ISODate 的 JSON 文件。

JSON 数据:

{
"_id" : ObjectId("5baca841d25ce14b7d3d017c"),
"country" : "in",
"state" : "",
"date" : ISODate("1902-01-31T00:00:00.000Z")
}

最佳答案

我想对 Maviles 做一些扩展' answer通过从其他几个 SO 问题中添加一些注释。

首先,来自 « Unable to deserialize PyMongo ObjectId from JSON » 我们了解到此数据看起来像实际 BSON/MOngo 扩展 JSON 对象的 Python 表示。 native BSON 文件也是二进制文件,而不是文本。

其次,来自« How can I use Python to transform MongoDB's bsondump into JSON? » 我们可以扩展 Fabian Fagerholm的回答:

def read_mongoextjson_file(filename):
with open(filename, "r") as f:
# read the entire input; in a real application,
# you would want to read a chunk at a time
bsondata = '['+f.read()+']'

# convert the TenGen JSON to Strict JSON
# here, I just convert the ObjectId and Date structures,
# but it's easy to extend to cover all structures listed at
# http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON
jsondata = re.sub(r'ObjectId\s*\(\s*\"(\S+)\"\s*\)',
r'{"$oid": "\1"}',
bsondata)
jsondata = re.sub(r'ISODate\s*\(\s*(\S+)\s*\)',
r'{"$date": \1}',
jsondata)
jsondata = re.sub(r'NumberInt\s*\(\s*(\S+)\s*\)',
r'{"$numberInt": "\1"}',
jsondata)

# now we can parse this as JSON, and use MongoDB's object_hook
# function to get rich Python data structures inside a dictionary
data = json.loads(jsondata, object_hook=json_util.object_hook)

return data

如您所见,比较以前的版本和这个版本,处理类型非常简单。使用 MongoDB Extended JSON reference对于您需要的任何其他内容。

一些额外的注意事项:

  • 我正在处理的文件是一系列对象,但它不是一个列表,我通过将所有内容放在方括号中来解决:
   bsondata = '['+f.read()+']'

否则我会在第一个对象的末尾得到一个 JSONDecodeError: Extra data: line 38 column 2 (char 1016)

pip uninstall bson
pip uninstall pymongo
pip install pymongo

这是一个 paste有一个完整的工作示例。

关于python - 如何在 Python 中读取包含 ObjectId 和 ISODate 的 json 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52672598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com