带有reviver函数的JSON.parse返回undefined

时间:2016-12-18 18:09:08

标签: javascript json javascript-objects

我是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;
&#13;
&#13;

3 个答案:

答案 0 :(得分:6)

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

您必须返回一些内容,即变量b

&#13;
&#13;
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;
&#13;
&#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);