Как десериализовать вложенный буфер с помощью JSON.разбор

Я пытаюсь сериализовать и десериализовать объект, который содержит несколько буферов, однако десериализуя полученную строку из JSON.stringify () с помощью JSON.parse () не удается правильно воссоздать буферы.

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

Это имеет смысл, так как вывод из буфера.toJSON () создает простой объект, например:

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

Я думаю, что я мог бы пересечь результирующий объект, ищущий подобъекты, которые имеют вышеуказанное свойства и преобразовать их обратно в буфер, однако я чувствую, что должно быть более элегантное решение с использованием JSON.parse (), которого мне не хватает.

2 ответов


можно использовать функция reviver это проверяет, выглядит ли объект как stringified 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 сериализует Buffers к:

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

вы можете просто проверить type и инициализировать буфер:

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