JSON.parse()方法用來解析 JSON 字符串,將字符串解析為 JavaScript 值或?qū)ο蟆?/p>
JSON.parse()接收兩個(gè)參數(shù),第一個(gè)是需要解析的字符串,第二個(gè)則是轉(zhuǎn)換器函數(shù)(可選),用來修改解析生成的原始值,調(diào)用時(shí)機(jī)在 parse 函數(shù)返回之前。
參數(shù)一:字符串
傳入的字符串,必須符合 JSON 的語法規(guī)范,否則會(huì)報(bào) SyntaxError 異常。
JSON.parse("{}"); // {}
JSON.parse("true"); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse("null"); // null
注意 1:轉(zhuǎn)換對(duì)象需要注意,如果是屬性名,必須要用雙引號(hào)括起來;
注意 2:只能單引號(hào)套雙引號(hào),不能雙引號(hào)套單引號(hào),必要時(shí)需要進(jìn)行轉(zhuǎn)義;
注意 3:不允許逗號(hào)作為對(duì)象或數(shù)組的結(jié)尾。
參數(shù)二:reviver 轉(zhuǎn)換器函數(shù)
如果指定了 reviver 函數(shù),則解析出的 JavaScript 值會(huì)經(jīng)過一次轉(zhuǎn)換后才將被最終返回。
具體步驟:解析值本身以及它所包含的所有屬性,會(huì)按照一定的順序(從最最里層的屬性開始,一級(jí)級(jí)往外,最終到達(dá)頂層,也就是解析值本身)分別去調(diào)用 reviver 函數(shù)。在調(diào)用過程中,當(dāng)前屬性所屬的對(duì)象會(huì)作為 this 值,當(dāng)前屬性名和屬性值會(huì)分別作為第一個(gè)和第二個(gè)參數(shù)傳入 reviver 中。如果 reviver 返回 undefined,則當(dāng)前屬性會(huì)從所屬對(duì)象中刪除,如果返回了其他值,則返回的值會(huì)成為當(dāng)前屬性新的屬性值。
當(dāng)遍歷到最頂層的值(解析值)時(shí),傳入 reviver 函數(shù)的參數(shù)會(huì)是空字符串 ""(因?yàn)榇藭r(shí)已經(jīng)沒有真正的屬性)和當(dāng)前的解析值(有可能已經(jīng)被修改過了),當(dāng)前的 this 值會(huì)是 {"": 修改過的解析值},在編寫 reviver 函數(shù)時(shí),要注意到這個(gè)特例。(這個(gè)函數(shù)的遍歷順序依照:從最內(nèi)層開始,按照層級(jí)順序,依次向外遍歷)。
JSON.parse('{"p": 5}', function (k, v) {
if (k === "") return v; // 如果到了最頂層,則直接返回屬性值,
return v * 2; // 否則將屬性值變?yōu)樵瓉淼?2 倍。
});
// {p: 10}
JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {
console.log(k); // 輸出當(dāng)前的屬性名,從而得知遍歷順序是從內(nèi)向外的,最后一個(gè)屬性名會(huì)是個(gè)空字符串。
return v; // 返回原始屬性值,相當(dāng)于沒有傳遞 reviver 參數(shù)。
});
// 1 2 4 6 5 3 ""
/*
{
"1": 1,
"2": 2,
"3": {
"4": 4,
"5": {
"6": 6
}
}
}
*/