簡體   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