JavaScript教程筆記(18)-JSON物件
1 什麼是JSON
JSON(JavaScript Object Notation)是一種用於資料交換的文字格式,目的是取代繁瑣笨重的XML格式。JSON格式提出後,被迅速接受,併成為各大網站交換資料的標準格式。
JSON格式有兩個顯著優點:
- 書寫簡單,一目瞭然;
- 符合JavaScript原生語法,由解釋引擎直接處理,無需額外解析程式碼。
每個JSON物件就是一個值,可以是一個原始型別的值,也可以是陣列或物件。它有以下規定。
- 複合型別的值只能是陣列或物件,不能是函式、正則表示式物件、日期物件。
- 原始型別的值只有四種:字串、數值(必須以十進位制表示)、布林值和
null
(不能使用NaN
、undefined
)。- 字串必須使用雙引號表示,不能使用單引號。
- 物件的鍵名必須放在雙引號裡面。
- 陣列或物件的最後一個成員後面,不能加逗號。
以下都是合法的JSON。
[ "one", "two", "three"]
{ "name": null }
{ "name": "小張", "age": 20 }
{ "name": ["小張", "小李"]}
以下都是不合法的JSON。
{ name: "小張", 'age': 20 } // 屬性名必須使用雙引號 { "name": "小張", "getName": function() { return this.name; } } // 屬性值不能使用函式
注意,null
、空陣列和空物件都是合法的JSON值。
2 JSON物件
JSON物件是JavaScript的原生物件,有兩個靜態方法:JSON.stringify()
和JSON.parse()
。
3 JSON.stringify()
3.1 基本用法
JSON.stringify()
用於將一個值轉化JSON字串。該字串將符合JSON格式,並且可以被JSON.parse
方法還原。
JSON.stringify('abc') // ""abc"" JSON.stringify([]) // "[]" JSON.stringify({name:"小張"}) // '{"name":"小張"}'
上面程式碼將各種型別的值,轉成JSON字串。
如果物件的屬性是undefined
、函式或XML物件,該屬性會被JSON.stringify
過濾。
var obj = {
a: undefined,
b: function() {}
};
JSON.stringify(obj) // "{}"
3.2 引數物件的toJSON方法
如果引數物件有自定義的toJSON
方法,那麼JSON.stringify
會使用這個方法的返回值作為引數,而忽略該物件的其它屬性。
先看一個普通物件。
var user = {
firstName: '三',
lastName: '張',
get fullName() {
return this.lastName + this.firstName;
}
};
JSON.stringify(user)
// "{"firstName":"三","lastName":"張","fullName":"張三"}"
現在,為這個物件加上toJSON
方法。
var user = {
firstName: '三',
lastName: '張',
get fullName() {
return this.lastName + this.firstName;
}
toJSON: function() {
return {
name: this.lastName + this.firstName
};
}
};
JSON.stringify(user)
// "{"name":"張三"}"
上面程式碼中,JSON.stringify
發現引數物件有toJSON
方法,就直接使用這個方法的返回值作為引數了。
JSON.stringify
預設不能轉換正則物件,但是通過 toJSON
方法就可以轉換了。
var obj = {
reg: /foo/
};
// 不設定 toJSON 方法時
JSON.stringify(obj) // "{"reg":{}}"
// 設定 toJSON 方法時
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/) // ""/foo/""
4 JSON.parse()
JSON.parse
方法用於將JSON字串轉換成對應的值。
JSON.parse('{}') // {}
JSON.parse('true') // true
var obj = JSON.parse('{"name": "張三"}');
obj.name // 張三
如果傳入字串不是有效的JSON格式,將會報錯。
JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL
上面程式碼中,因為單引號字串不符合JSON格式,所以報錯。
為了處理解析錯誤,可以將JSON.parse
方法放在try...catch
程式碼塊中。
try {
JSON.parse("'String'");
} catch(e) {
console.log('parsing error');
}
注:本文適用於ES5規範,原始內容來自 JavaScript 教程,有修改。