我正在使用' bson'浏览器中的npm包,用于将JSON对象转换/序列化为BSON。文档说它返回一个Node.js缓冲区。 Node.js的文档说缓冲区属于' Uint8Array'。现在我想在另一个JSON对象(infoJSON)中发送这个Uint8Array,但是JSON不支持Uint8Array。我试图将缓冲区(Uint8Array)转换为一个简单的数组,将其插入JSON对象(infoJSON),然后将其直接从JSON对象转换回Uint8Array。但是这个新的Uint8Array无法反序列化回原始person对象(参见结果)。它坏了。
为什么我使用BSON? 我想将原始对象拆分为多个块,以通过WebRTC数据通道发送,该数据通道具有数据大小的限制。我需要能够识别每个块(类型)。这就是我使用嵌套对象的原因。
var personJSON = { 'name': 'sarah' } // JSON
var personBuffer = Bson.serialize(personJSON) // Uint8Array
var personArray = Array.from(personBuffer) // Simple array
var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
console.log('deserializedObj:')
console.log(Bson.deserialize(personUint8Array))
结果:
答案 0 :(得分:0)
这是因为Bson.serialize
and Bson.deserialize
use a Node.js like Buffer
object。
您可以使用基础ArrayBuffer
创建Uint8Array
(test online)来解决此问题,然后使用Buffer.from
:
var personJSON = { 'name': 'sarah' } // JSON
var personBuffer = new Uint8Array(Bson.serialize(personJSON).buffer) // Uint8Array
var personArray = Array.from(personBuffer) // Simple array
var infoJSON = { 'count': 1, 'person': personArray } // Inserting array into JSON
var personUint8Array = Uint8Array.from(infoJSON.person) // Converting array back to Uint8Array
console.log('deserializedObj:')
console.log(Bson.deserialize(Buffer.from(personBuffer)))
答案 1 :(得分:-1)
您无法通过JSON发送二进制数据或不发送JSON对象。如果你想这样做,那么我建议你在base64中对你的unit8array进行编码,如下所示:
let base64 = btoa(String.fromCharCode.apply(null, personUnit8Array));
现在你可以简单地将该字符串附加到另一个JSON中并将其发送。要将其转换回unit8Array,只需执行以下操作:
let personUnit8Array = new Unit8Array(atob(base64).split("").map(
(char)=>char.charCodeAt(0)
)
);
我建议你避免尝试使用JSON支持的其他对象类型,如果你需要这样做,那么你可能不需要JSON格式。