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

如何使用Python将MongoDB的bsondump转换为JSON?

苏鹏鹍
2023-03-14
问题内容

因此,我在MongoDB转储中有大量的.bson。我在命令行上使用bsondump,将输出作为stdin传递到python。这可以成功地将BSON转换为“
JSON”,但实际上它是一个字符串,似乎不是合法的JSON。

例如,输入行如下所示:

{ "_id" : ObjectId( "4d9b642b832a4c4fb2000000" ),
  "acted_at" : Date( 1302014955933 ),
  "created_at" : Date( 1302014955933 ),
  "updated_at" : Date( 1302014955933 ),
  "_platform_id" : 3,
  "guid" : 72106535190265857 }

我相信的是Mongo Extended
JSON

当我在这样一行中阅读并执行以下操作时:

json_line = json.dumps(line)

我得到:

"{ \"_id\" : ObjectId( \"4d9b642b832a4c4fb2000000\" ),
\"acted_at\" : Date( 1302014955933 ),
\"created_at\" : Date( 1302014955933 ),
\"updated_at\" : Date( 1302014955933 ),
\"_platform_id\" : 3,
\"guid\" : 72106535190265857 }\n"

哪一个还是<type 'str'>

我也尝试过

json_line = json.dumps(line, default=json_util.default)

(请参阅pymongo json_util-垃圾邮件检测可防止第三个链接),该输出似乎与上述转储输出相同。加载给出错误:

json_line = json.loads(line, object_hook=json_util.object_hook)
ValueError: No JSON object could be decoded

那么,如何将TenGen JSON的字符串转换为可解析的JSON?(最终目标是将制表符分隔的数据流传输到另一个数据库)


问题答案:

您所拥有的是TenGen模式下的Mongo Extended
JSON中的转储(请参阅此处)。一些可行的方法:

  1. 如果可以再次转储,请通过MongoDB REST API使用严格输出模式。那应该给您真正的JSON,而不是现在的JSON。

  2. 使用bson从http://pypi.python.org/pypi/bson/读你已经有了BSON到Python的数据结构,然后做任何处理,你需要对这些(可能输出JSON)。

  3. 使用MongoDB Python绑定连接到数据库以将数据导入Python,然后进行所需的任何处理。(如果需要,您可以设置本地MongoDB实例,然后将转储的文件导入该实例。)

  4. 将Mongo Extended JSON从TenGen模式转换为Strict模式。您可以开发一个单独的过滤器来做到这一点(从stdin读取,将TenGen结构替换为Strict结构,并在stdout上输出结果),也可以在处理输入时做到这一点。

这是一个使用Python和正则表达式的示例:

import json, re
from bson import json_util

with open("data.tengenjson", "rb") 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'Date\s*\(\s*(\S+)\s*\)',
                      r'{"$date": \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)

    # just print the output for demonstration, along with the type
    print(data)
    print(type(data))

    # serialise to JSON and print
    print(json_util.dumps(data))

根据您的目标,其中一个应该是一个合理的起点。



 类似资料:
  • 本文向大家介绍如何使用Python将HTML转换为PDF,包括了如何使用Python将HTML转换为PDF的使用技巧和注意事项,需要的朋友参考一下 Python提供了Pdfcrowd API v2,可将HTML文档转换为PDF。该API非常易于使用,集成仅需要几行代码。 安装 从网页/ HTML到PDF的以下3个步骤将完成转换 步骤1-下载库pdfkit 步骤2-现在下载wkhtmltopdf 对

  • 问题内容: 我正在寻找使用Python将网页打印为本地文件PDF的解决方案。很好的解决方案之一是使用Qt。 由于我在安装PyQt4时遇到问题,因此一开始并不起作用,因为它给出了错误消息,例如“ ImportError:没有名为PyQt4.QtCore的模块”和“ImportError:没有名为PyQt4.QtCore的模块”。 这是因为PyQt4没有正确安装。我曾经将库放在C:\ Python27

  • 问题内容: 在模块中,我只能找到带有cos / sin / tan / acos / asin / atan的。这将返回以弧度为单位的答案。如何获得度数的答案? 这是我的代码: 我的度数计算器为我提供: 问题答案: Python在包中包括两个函数;将度数转换为弧度,并将弧度转换为度。 要匹配计算器的输出,您需要: 请注意,所有的三角函数都在角度和三角形两侧的比率之间转换。cos,sin和tan以弧

  • 问题内容: 我有一个要转换为CSV文件的JSON文件。如何使用Python执行此操作? 我试过了: 但是,它没有用。我正在使用Django,收到的错误是: 然后,我尝试了以下方法: 然后我得到错误: 样本json文件: 问题答案: 首先,你的JSON具有嵌套对象,因此通常无法直接将其转换为CSV。你需要将其更改为以下内容: 这是从中生成CSV的代码: 你将获得以下输出:

  • 问题内容: 下面是我从在线气象站提取的json结构。我还包括一个json_to_csv python脚本,该脚本应该将json数据转换为csv输出,但仅返回“ Key”错误。我只想从“ current_observation”中提取数据。 检索温度字符串并将其转换为.csv格式的最佳方法是什么?谢谢! 问题答案: 也许熊猫可以为您提供帮助。.read_json()函数创建一个不错的数据框,您可以从

  • 问题内容: 我试图将一个相当简单的Python程序转换为可执行文件,但是找不到我想要的东西,所以我有几个问题(我正在运行Python3.6): 到目前为止,我发现这样做的方法如下 下载旧版本的Python并使用 在3.6中设置虚拟环境,这将允许我执行1。 下载Python到C ++转换器并使用它。 这是我尝试过的/遇到的问题。 我在安装所需的下载之前安装了它(pypi-something),所以它