我试图将一个由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
作为编码,否则将无法正常工作。{"key3": [{"k0": "random", "k1": "string", "k2": "to use", "k3": 3.145}, {"k0": "other", "k1": "values", "k2": "here", "k3": 0.0001}]}
将导致 Uncaught error
尺码不一致的地方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"}}}
假设你的文件内容在 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();