如何使用JSON.parse反序列化嵌套缓冲区

How to deserialize a nested Buffer using JSON.parse

本文关键字:嵌套 缓冲区 反序列化 parse 何使用 JSON      更新时间:2023-09-26

我正在尝试序列化和取消序列化一个包含多个缓冲区的对象,但是用JSON.parse()取消序列化JSON.stringfy()生成的字符串无法正确地重新创建缓冲区。

var b64 = 'Jw8mm8h+agVwgI/yN1egchSax0WLWXSEVP0umVvv5zM='; 
var buf = new Buffer(b64, 'base64');
var source = {
    a: {
        buffer: buf
    }
};
var stringify = JSON.stringify(source);
var parse = JSON.parse(stringify);
console.log("source: "+source.a.buffer.constructor.name);
console.log("parse: "+parse.a.buffer.constructor.name);

输出:

source: Buffer
parse: Object

这是有道理的,因为Buffer.toJSON()的输出创建了一个简单的对象,如下所示:

{
  type: "Buffer",
  data: [...]
}

我想我可以遍历生成的对象,寻找具有上述属性的子对象,并将它们转换回Buffer,但我觉得应该有一个更优雅的解决方案,使用JSON.parse(),但我缺少它。

您可以使用一个reviver函数来检查对象是否像字符串化的Buffer,并从中创建一个合适的实例:

var parse = JSON.parse(stringify, (k, v) => {
  if (
    v !== null            &&
    typeof v === 'object' && 
    'type' in v           &&
    v.type === 'Buffer'   &&
    'data' in v           &&
    Array.isArray(v.data)) {
    return new Buffer(v.data);
  }
  return v;
});

由于JSON将Buffer序列化为:

{
  type: "Buffer",
  data: [...]
}

您只需检查type并重新初始化缓冲区:

if (source.buf.type === 'Buffer') {
  source.buf = new Buffer(source.buf.data);
}