Javascript 如何使用JSON.parse反序列化嵌套缓冲区
我正在尝试序列化和反序列化一个包含多个缓冲区的对象,但是用JSON.parse()反序列化JSON.stringify()生成的字符串无法正确地重新创建缓冲区Javascript 如何使用JSON.parse反序列化嵌套缓冲区,javascript,json,node.js,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 = JSO
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: [...]
}
我想我可以遍历结果对象,查找具有上述属性的子对象,并将它们转换回缓冲区,但是我觉得应该有一个更优雅的解决方案,使用我缺少的JSON.parse()。因为JSON将
缓冲区序列化为:
{
type: "Buffer",
data: [...]
}
您只需检查类型
,然后重新初始化缓冲区:
if (source.buf.type === 'Buffer') {
source.buf = new Buffer(source.buf.data);
}
您可以使用检查对象是否看起来像字符串化的缓冲区
,并从中创建适当的实例:
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支持的唯一结构化数据类型是对象和数组JSON.parse
对Buffer
一无所知。Buffer.toJSON
方法只是将缓冲区转换为JSON.parse
可以理解的内容。您可以将a传递给JSON.parse
,以避免手动遍历。当您找到缓冲区
属性时,您将获取该值并手动创建并返回您的缓冲区
@squint我们也这么想,如果我“偷走”了您的答案,请原谅:-)@robertklep:不,一点也不。如果我愿意,我会把它贴在下面。:-)我相信他知道如何创建缓冲区。他在问如何让它自动解析到缓冲区。“…我可以遍历结果对象,寻找具有上述属性的子对象,并将它们转换回缓冲区,但我觉得应该有一个更优雅的解决方案…”他可能没有源代码。我真的怀疑他是否真的在做一个stringify
之后紧接着一个parse
@skint-Whoops,应该仔细阅读。Robertklep的答案就是答案。只是好奇,类型
和数据
从哪里来?@斜视这些是缓冲区
被字符串化到的对象的属性。我在字符串化缓冲区时没有得到这些属性。你确定吗?@squintJSON.stringify(新缓冲区('foo'))
->{“类型”:“缓冲区”,“数据”:[102111111]}
(节点v4.2.1)@robertklep,请注意,null
值会失败。因为typeof null
是的“对象”
。使用{foo:null}
尝试此操作,会出现错误(因为无法枚举null
)。