標籤:
概述
JSON.parse() 方法可以將一個 JSON 字串解析成為一個 JavaScript 值。在解析過程中,還可以選擇性的修改某些屬性的原始解析值。
文法
JSON.parse(text[, reviver])
參數
text
要解析的 JSON 字串,可以查看 JSON 一文瞭解 JSON 的文法。
reviver 可選
一個函數,用來轉換解析出的屬性值。
傳回值
從 text 字串解析出的一個 Object。
異常
如果被解析的 JSON 字串包含語法錯誤,則會拋出 SyntaxError 異常。
樣本
使用 JSON.parse()
JSON.parse(‘{}‘); // {}
JSON.parse(‘true‘); // true
JSON.parse(‘"foo"‘); // "foo"
JSON.parse(‘[1, 5, "false"]‘); // [1, 5, "false"]
JSON.parse(‘null‘); // null
使用 reviver 函數
如果指定了 reviver 函數,則解析出的 JavaScript 值(解析值)會經過一次轉換後才將被最終返回(傳回值)。更具體點講就是:解析值本身以及它所包含的所有屬性,會按照一定的順序(從最最裡層的屬性開始,一級級往外,最終到達頂層,也就是解析值本身)分別的去調用 reviver 函數,在調用過程中,當前屬性所屬的對象會作為 this 值,當前屬性名稱和屬性值會分別作為第一個和第二個參數傳入 reviver 中。如果 reviver 返回 undefined,則當前屬性會從所屬對象中刪除,如果返回了其他值,則返回的值會成為當前屬性新的屬性值。
當遍曆到最頂層的值(解析值)時,傳入 reviver 函數的參數會是Null 字元串 ""(因為此時已經沒有真正的屬性)和當前的解析值(有可能已經被修改過了),當前的 this 值會是 {"": 修改過的解析值},在編寫 reviver 函數時,要注意到這個特例。
JSON.parse(‘{"p": 5}‘, function (k, v) {
if(k === ‘‘) return v; // 如果到了最頂層,則直接返回屬性值,
return v * 2; // 否則將屬性值變為原來的 2 倍。
}); // { p: 10 }
JSON.parse(‘{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}‘, function (k, v) {
console.log(k); // 輸出當前的屬性名稱,從而得知遍曆順序是從內向外的,
// 最後一個屬性名稱會是個Null 字元串。
return v; // 返回原始屬性值,相當於沒有傳遞 reviver 參數。
});
// 1
// 2
// 4
// 6
// 5
// 3
// ""
JSON.parse() 不允許用逗號作為結尾
// both will throw a SyntaxError
JSON.parse("[1, 2, 3, 4, ]");
JSON.parse(‘{"foo" : 1, }‘);
規範
正式名稱 |
規範狀態 |
備忘 |
ECMAScript 5.1 (ECMA-262) JSON.parse |
Standard |
首次定義,於 JavaScript 1.7 版本中實現。 |
ECMAScript 2015 (6th Edition, ECMA-262) JSON.parse |
Standard |
|
瀏覽器安全色性
Feature |
Chrome |
Firefox (Gecko) |
Internet Explorer |
Opera |
Safari |
Basic support |
(Yes) |
3.5 (1.9.1) |
8.0 |
10.5 |
4.0 |
Gecko 備忘
從 Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) 開始,如果被解析的 JSON 字串含有語法錯誤,則該方法拋出的錯誤資訊中將包含錯誤發生時具體的行列號,這個特性對於調試大型 JSON 資料來說是很有用的。
JSON.parse(‘[1, 2,3,]‘)
//SyntaxError: JSON.parse: unexpected character at
// line 1column 10 of the JSON data
相關連結
JSON.parse()