繁体   English   中英

在 JSON object 中发送 Uint8Array (BSON)

[英]Sending Uint8Array (BSON) in a JSON object

我在浏览器中使用' bson ' npm package 来转换/序列化 JSON2666CFDE691ACC49 文档说它返回一个 Node.js 缓冲区。 Node.js 的文档说缓冲区的类型为“Uint8Array”。 现在我想将这个 Uint8Array 发送到另一个 JSON object (infoJSON) 但 JSON 不支持 Uint8Array。 I tried to convert the buffer (Uint8Array) to a simple array, inserting it in the JSON object (infoJSON) and then I convert it back to Uint8Array directly out of the JSON object. 但是这个新的 Uint8Array 不能反序列化回原来的人 object(看结果)。 它被打破。

为什么我使用 BSON? 我想将原始 object 拆分为多个块,以通过 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))

结果:

结果

这是因为Bson.serializeBson.deserialize使用Node.js之类的Buffer对象

您可以通过使用基础的ArrayBuffer创建一个Uint8Array在线测试 )并使用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)))

我真的很喜欢上面的答案......最后我结束了

const payload = {hello: 'alex'}
const array = Array.from(serialize(payload))
const json = JSON.stringify(array)
const payload2 = deserialize(Uint8Array.from((JSON.parse(json)))
console.log(payload === payload2)

第一个将有效负载转换为可以添加到任何 object 的数组,该数组将转换为 JSON。

第二个将 json 转换回原始有效载荷

您不能通过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格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM