[英]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.