将保存在文件中的BSON数据转换为Javascript对象。

问题描述 投票:0回答:1

我试图将一个由python脚本生成的BSON文件转换成一个Javascript对象。我使用的是 https:/www.npmjs.compackagebson 的BSON包,并使用 XMLHttpRequest 来加载文件。

如果有必要,这是我的package-lock.json条目,用于载入 bson.

        "bson": {
            "version": "4.0.4",
            "resolved": "https://registry.npmjs.org/bson/-/bson-4.0.4.tgz",
            "integrity": "sha512-Ioi3TD0/1V3aI8+hPfC56TetYmzfq2H07jJa9A1lKTxWsFtHtYdLMGMXjtGEg9v0f72NSM07diRQEUNYhLupIA==",
            "requires": {
                "buffer": "^5.1.0",
                "long": "^4.0.0"
            },
            "dependencies": {
                "buffer": {
                    "version": "5.6.0",
                    "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
                    "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
                    "requires": {
                        "base64-js": "^1.0.2",
                        "ieee754": "^1.1.4"
                    }
                }
            }
        }

生成的文件是基于一个非常简单的python程序。

data = { 'key0': 'a', 'key1': [ 1, 2, 3 ], 'key2': 'b', 'key3': [ { 'k0': 'random', 'k1': 'string', 'k2': 'to use', 'k3': 3.145 }, { 'k0': 'other', 'k1': 'values', 'k2': 'here', 'k3': 0.0001}] }
with open('test.bson', 'wb') as fp:
    encoded = bson.encode(data)
    fp.write(encoded)

被用于python的包是 pymongo (3.10.1版)。

注意: 我更新了 data dict. 当我使用Dekel的解决方案时,第一个版本可以正常工作。但是,我的实际数据却不能用。我修改了它,现在它不能用这个错误。

Uncaught Error: buffer length 199 must === bson size 253
  deserialize$1 

我可以加载文件,但是我不能找出正确的BSON调用,在JS中使用,以使其成为一个Javascript对象。我遇到了错误的类型错误(需要一个 Buffer)、转码错误或异常。

我的代码看起来像下面这样(它使用了Dekel的 deserialize 在他的回答中)。)

import { deserialize } from 'bson'

let xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = () => {
    if (xmlHttp.status == 200 && xmlHttp.readyState == 4) {
        const buf = Buffer.from(xmlHttp.responseText, 'binary');
        const dat = deserialize(buf, {});
        console.log(dat);
    }
};
xmlHttp.open("GET", 'assets/test.bson');
xmlHttp.send();

如果我没有使用 {} 作为第二个参数 deserialize,它产生的结果是

 TS2554: Expected 2 arguments, but got 1

我是使用Webpack和Typescript进行开发的。

不知道从JS BSON实现的角度来看,数据也许是不正确的,还是我调用JS BSON不正确。

我可以用python对文件进行解码,并且 bsondump 也能正确解码文件。

我已经创建了一个GitHub repo,里面有更多的细节以及测试数据。https:/github.commobilebentest-bson-js)。

还发现了一些其他细节。

  • 当转换到一个 Buffer,必须包括 binary 作为编码,否则将无法正常工作。
  • 这个json(注意是用python dict表示的) {"key3": [{"k0": "random", "k1": "string", "k2": "to use", "k3": 3.145}, {"k0": "other", "k1": "values", "k2": "here", "k3": 0.0001}]} 将导致 Uncaught error 尺码不一致的地方
  • 浮动值,当使用一个不会导致的dict时,会出现 Uncaught error,有错误的值。如果我使用整数值,它们就会正常。

对于最后一项

{"key3": {"k9": "here", "k0": 1, "k1": 2, "k2": 3}}

将工作。它的结果是(在JS方面)

{"key3":{"k9":"here","k0":1,"k1":2,"k2":3}}

然而

{"key3": {"k9": "here", "k0": 0.1, "k1": 0.2, "k2": 0.3}}

结果是(在JS方面

{"key3":{"k9":"here","k0":1.8745098039215684,"k1":1.8745098039215684,"k2":1.825}}

跑步 bsondump 在同一个文件上产生。

{"key3":{"k9":"here","k0":{"$numberDouble":"0.1"},"k1":{"$numberDouble":"0.2"},"k2":{"$numberDouble":"0.3"}}}
javascript bson
1个回答
1
投票

假设你的文件内容在 data 变量,你可以使用BSON lib的以下内容。

import { deserialize } from 'bson';
import data from '!!raw-loader!assets/test.bson'

console.log(deserialize(Buffer.from(data)))

如果你正在使用xmlhttprequest,

import { deserialize } from 'bson';

let xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = () => {
    if (xmlHttp.status == 200 && xmlHttp.readyState == 4) {
        console.log(deserialize(Buffer.from(xmlHttp.responseText)));
    }
};
xmlHttp.open("GET", 'assets/test.bson');
xmlHttp.send();
© www.soinside.com 2019 - 2024. All rights reserved.