在JSON对象中发送Uint8Array(BSON)

时间:2018-03-13 14:50:30

标签: javascript arrays json bson uint8array

我正在使用' 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))

结果:

result

2 个答案:

答案 0 :(得分:0)

这是因为Bson.serialize and Bson.deserialize use a Node.js like Buffer object

您可以使用基础ArrayBuffer创建Uint8Arraytest 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格式。