Javascript 如何使用JSON.parse反序列化嵌套缓冲区

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

我正在尝试序列化和反序列化一个包含多个缓冲区的对象,但是用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);
给出输出:

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的答案就是答案。只是好奇,
类型
数据
从哪里来?@斜视这些是
缓冲区
被字符串化到的对象的属性。我在字符串化缓冲区时没有得到这些属性。你确定吗?@squint
JSON.stringify(新缓冲区('foo'))
->
{“类型”:“缓冲区”,“数据”:[102111111]}
(节点v4.2.1)@robertklep,请注意,
null
值会失败。因为
typeof null
的“对象”
。使用
{foo:null}
尝试此操作,会出现错误(因为无法枚举
null
)。