Как десериализовать вложенный буфер с помощью 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 сериализует Buffer
s к:
{
type: "Buffer",
data: [...]
}
вы можете просто проверить type
и инициализировать буфер:
if (source.buf.type === 'Buffer') {
source.buf = new Buffer(source.buf.data);
}