我是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>"
);
&#13;
答案 0 :(得分:6)
因为你的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>');
&#13;
答案 1 :(得分:0)
您只需要返回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>"
);
答案 2 :(得分:0)
根据reviver
description on MDN:
如果reviver函数返回undefined(或者不返回任何值,例如,如果执行从函数末尾开始),则从对象中删除该属性。
这正是这里发生的事情。因为你的reviver函数中没有return
语句,所以它隐式返回undefined。您可以在下面看到等效内容:
function (a,b) {
console.log(a + "=>" + b);
return undefined;
}
因此,在这种情况下,JSON.parse
实际上正确地将您的字符串解析为一个对象,然后通过reviver函数放置它的属性,该函数为所有这些函数返回undefined。这会导致返回undefined
。
如果要使其正确解析对象,可以显式返回值:
var jObj = JSON.parse(str,function(a,b){
console.log(a + "=>" + b);
return b;
});
或一起删除reviver:
var jObj = JSON.parse(str);