如何使用JSON.parse反序列化嵌套的Buffer

我试图序列化和反序列化包含多个缓冲区的对象,但是从JSON.stringify()反序列化JSON.stringify()与JSON.parse()无法正确重新创build缓冲区。

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()的输出创build一个简单的对象,如下所示:

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

我想我可以遍历生成的对象寻找具有上述属性的子对象,并将其转换回一个缓冲区,但我觉得应该有一个更优雅的解决scheme,使用我缺less的JSON.parse()。

你可以使用reviver函数来检查一个对象是否像一个string化的Buffer ,并从中创build一个适当的实例:

 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); }