繁体   English   中英

带有reviver函数的JSON.parse返回未定义

[英]JSON.parse with reviver function returns undefined

我是JSON的新手,在JSON.parse()使用reviver参数时遇到此异常:

TypeError: Cannot read property 'name' of undefined(…).

没有reviver参数代码可以正常工作,但使用reviver参数时,它将引发上述异常。 为什么会这样呢?

 var str = ' { ' + ' "name" : "Username", ' + ' "fname" : "Fathername" ' + ' } '; var jObj = JSON.parse(str, function (a, b) { console.log(a + "=>" + b); }); document.write( "<h1>" + jObj.name + "</h1>", "<h2>" + jObj.fname + "</h2>" ); 

因为您的reviver函数隐式返回undefined

您必须返回一些东西,即变量b

 var str = JSON.stringify({ name: 'Username', fname: 'Fathername' }); var jObj = JSON.parse(str, function (a, b) { console.log(a, '=>', b); return b; }); document.write('<h1>' + jObj.name + '</h1>', '<h2>' + jObj.fname + '</h2>'); 

您只需要返回JSON.parse的值。 这是一个带有更漂亮代码的示例:

 var str = '{"name": "Username", "fname": "Fathername"}'; var parsed = JSON.parse(str, (key, value) => { return value; }); document.write( "<h1>" + parsed.name + "</h1>", "<h2>" + parsed.fname + "</h2>" ); 

按照reviver 在MDN说明

如果reviver函数返回未定义的值(或不返回任何值,例如,如果执行落在函数的末尾),则从对象中删除该属性。

这正是这里发生的情况。 由于reviver函数中没有return语句,因此它隐式返回undefined。 在下面您可以看到一个等效项:

function (a,b) {
  console.log(a + "=>" + b);
  return undefined;
}

因此,在这种情况下, JSON.parse实际上将您的字符串正确解析为一个对象,然后通过reviver函数放置其属性,该函数针对所有对象返回未定义。 这导致返回undefined

如果要使其正确解析对象,则可以显式返回值:

var jObj = JSON.parse(str,function(a,b){
  console.log(a + "=>" + b);
  return b;
});

或一起移除齐磊:

var jObj = JSON.parse(str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM