当前位置: 首页 > 知识库问答 >
问题:

我怎么能使用Python将MongoDB的bsonrey转换成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扩展的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"

这仍然是<代码>

我也试过

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

(参见pymongojson_util-垃圾邮件检测阻止了第三个链接)这似乎输出与上面的转储相同。负载给出一个错误:

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

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

共有3个答案

傅明知
2023-03-14

您可以像这样转换bson文件的行:

>>> import bson
>>> bs = open('file.bson', 'rb').read()
>>> for valid_dict in bson.decode_all( bs ):
....

每个有效的_dict元素都将是一个有效的python dict,您可以将其转换为json。

邓威
2023-03-14

将整个bson文档加载到python内存是非常昂贵的。

如果您想将其流式传输,而不是加载整个文件并执行全部加载,您可以尝试使用此库。

https://github.com/bauman/python-bson-streaming

from bsonstream import KeyValueBSONInput
from sys import argv
for file in argv[1:]:
    f = open(file, 'rb')
    stream = KeyValueBSONInput(fh=f,  fast_string_prematch="somthing") #remove fast string match if not needed
    for id, dict_data in stream:
        if id:
         ...process dict_data...
谈琦
2023-03-14

您所拥有的是TenGen模式下蒙戈扩展JSON中的转储(请参阅此处)。一些可能的方法:

>

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

    使用bsonfromhttp://pypi.python.org/pypi/bson/要将BSON读入Python数据结构中,然后对这些数据结构执行所需的任何处理(可能输出JSON)。

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

    将Mongo扩展JSON从TenGen模式转换为Strict模式。您可以开发一个单独的过滤器来执行此操作(从stdin读取,用Strict结构替换TenGen结构,并在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))
    

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

  •  类似资料:
    • 谁能告诉我从.p12文件中提取/转换证书.crt文件的正确方法/命令吗?在我搜查之后。我找到了将.pem转换为.crt的方法。但未找到.p12到.crt。

    • 问题内容: 因此,我在MongoDB转储中有大量的.bson。我在命令行上使用bsondump,将输出作为stdin传递到python。这可以成功地将BSON转换为“ JSON”,但实际上它是一个字符串,似乎不是合法的JSON。 例如,输入行如下所示: 我相信的是Mongo Extended JSON 。 当我在这样一行中阅读并执行以下操作时: 我得到: 哪一个还是。 我也尝试过 (请参阅pymo

    • 问题内容: 我有一个WSDL文件,我需要将其转换为Java,为此,我使用下面链接中的分步过程 http://axis.apache.org/axis2/java/core/tools/eclipse/wsdl2java- plugin.html 就像将axis2 codegen jar文件添加到eclipse文件夹中的dropins文件夹中并重新启动eclipse一样,但是我在eclipse ID

    • 问题内容: 我正在开发一个Web应用程序,其中将在客户端和服务器端之间传输数据。 我已经知道JavaScript int!= Java int。因为,Java int不能为null,对。现在这是我面临的问题。 我将Java int变量更改为Integer。 我的问题在这里: 我不能在这里使用Integer变量。我尝试过, 但这会使事情变得更复杂。我们还有其他 转换方法或转换技术吗? 任何修复都会更

    • 问题内容: 如果我有: 我需要 PHP是否为此提供功能? 问题答案: 尝试以下尺寸: 输出: 这实现了以下规则: 以小写字母开头的序列后必须跟小写字母和数字; 以大写字母开头的序列后面可以是: 一个或多个大写字母和数字(后跟字符串的结尾或大写字母,后跟小写字母或数字,即下一个序列的开头);要么 一个或多个小写字母或数字。

    • 怎么用java将 xlsx文件 转换成 csv 格式 我想通过java后台将一个xlsx格式的文件转为csv文件,并且可以导出,有推荐的工具或方案吗? 如果有代码示例就更好了