Gee*_*aks 6 javascript json node.js
我试图序列化和反序列化包含多个缓冲区的对象,但是使用JSON.parse()从JSON.stringify()反序列化生成的字符串无法正确地重新创建缓冲区.
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);
Run Code Online (Sandbox Code Playgroud)
给出了输出:
source: Buffer
parse: Object
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为Buffer.toJSON()的输出创建了一个简单的对象,如下所示:
{
type: "Buffer",
data: [...]
}
Run Code Online (Sandbox Code Playgroud)
我想我可以遍历生成的对象,寻找具有上述属性的子对象并将它们转换回Buffer,但是我觉得应该有一个更优雅的解决方案,使用我失踪的JSON.parse().
rob*_*lep 17
您可以使用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;
});
Run Code Online (Sandbox Code Playgroud)
小智 6
由于 JSON 将Buffers 序列化为:
{
type: "Buffer",
data: [...]
}
Run Code Online (Sandbox Code Playgroud)
您只需检查type并重新初始化缓冲区即可:
if (source.buf.type === 'Buffer') {
source.buf = new Buffer(source.buf.data);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4232 次 |
| 最近记录: |