【问题标题】:JSON.parse with reviver function returns undefinedJSON.parse 与 reviver 函数返回未定义
【发布时间】:2017-05-03 20:11:07
【问题描述】:

我是 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>"
);

【问题讨论】:

  • 是的,上面写着'未定义'。'
  • jObj 返回“未定义”。
  • 是的,我的兄弟 :)
  • 兄弟,我可以在 facebook 上与您联系吗?需要和你谈谈。这将是空地。请在此处分享您的 Facebook 时间线 URL,以便通过以下方式与您联系。

标签: javascript json javascript-objects


【解决方案1】:

因为您的 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>');

【讨论】:

    【解决方案2】:

    您只需返回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>"
     );
     

    【讨论】:

      【解决方案3】:

      根据reviverdescription 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;
      });
      

      或一起移除复活者:

      var jObj = JSON.parse(str);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-02
        • 2012-12-27
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多