2

我在浏览器中使用“ 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))

结果:

结果

4

2 回答 2

1

您不能通过 JSON 发送二进制数据或非 JSON 对象。如果您想这样做,那么我建议您将 unit8array 编码为 base64,如下所示:

  let base64 = btoa(String.fromCharCode.apply(null, personUnit8Array));

现在您可以简单地将该字符串附加到另一个 JSON 中并将其发送。要将其转换回 unit8Array,只需执行以下操作:

  let personUnit8Array = new Unit8Array(atob(base64).split("").map(
      (char)=>char.charCodeAt(0)
    )
   );

我建议您避免尝试使用 JSON 支持的对象类型以外的其他对象类型,如果您需要这样做,那么您可能不需要 JSON 格式。

于 2018-03-13T15:18:10.417 回答
1

这是因为Bson.serializeBson.deserialize使用了 Node.js 之类的Bufferobject

您可以通过使用底层ArrayBuffer创建一个Uint8Array在线测试)并使用然后使用来纠正此问题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)))
于 2018-03-13T15:41:12.977 回答