1. 程式人生 > >JS高程3:JSON

JS高程3:JSON

urn val 中國 包括 沒有 16px gif 還原 new

JSON,JavaScript Object Notation,JS對象表示法,是目前最常見的結構化數據傳輸形式。

JSON並非編程語言,而是一種數據結構,像mp4、avi一樣,只是一種數據格式而已。(數據結構可以包含很多數據類型)

JSON值的類型

  • 簡單值
  • 對象
  • 數組

簡單值:字符串、數字、布爾值和null,註意不包括undefined。

註意:JSON中的字符串必須用雙引號。

對象:對象就是無序的鍵值對,而鍵值中的值也可以是簡單值、對象或者數組。

註意:JSON中對象的屬性必須用雙引號括起來,JSON中沒有變量的概念。

數組:有序的值的列表,而值本身可以是簡單值、對象或者數組。

解析與序列化

JS中有個全局對象JSON,該對象有stringify()和parse()方法,分別用來序列化JS和解析JSON。

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1);
console.log(j2)

註意:因為JSON中沒有undefined數據類型,所以該鍵值會被忽略。

{"name":"leo","age":19,"marry":false
,"none":null} {name: "leo", age: 19, marry: false, none: null}

序列化選項

JSON.stringify()函數還可以接收第二個和第三個參數,用來實現更為豐富的功能。

過濾

第二個參數可以是一個數組,數組包含對象屬性的字符串形式:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,["name","age",]);
console.log(j1); //{"name":"leo","age":19}

如果參數是函數:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,function(key,value){
		switch(key){
			case "age":
				return 20;
			case "none":
				return "沒有";
			case "marry":
				return "false";
			default:
				return value;
		}
});
console.log(j1); //{"name":"leo","age":20,"marry":"false","none":"沒有"}

縮進

如果想縮進4空格:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,null,4);
console.log(j1);
{
    "name": "leo",
    "age": 19,
    "marry": false,
    "none": null
}

註意:最大縮進為10格。

特殊字符:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
};
var j1 = JSON.stringify(obj,null,"-->");
console.log(j1);
{
-->"name": "leo",
-->"age": 19,
-->"marry": false,
-->"none": null
}

使用toJSON:

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
	toJSON: function(){
		return this.name;
	}
};
var j1 = JSON.stringify(obj);
console.log(j1); //"leo"

序列化該對象的順序如下

(1) 如果存在 toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,返回對象本身。
(2) 如果提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第(1)步返回的值。
(3) 對第(2)步返回的每個值進行相應的序列化。
(4) 如果提供了第三個參數,執行相應的格式化。

解析選項

JSON.parse()方法也可以接收另一個參數,該參數是一個函數,將在每個鍵值對兒上調用

var obj = {
	name: "leo",
	age: 19,
	marry: false,
	other: undefined,
	none: null,
	releaseDate: new Date(2011, 11, 1),
};
var j1 = JSON.stringify(obj);
console.log(j1);
var j2 = JSON.parse(j1,function(key,value){
	if (key == "releaseDate"){
		return new Date(value);
	} else {
		return value;
}
});
console.log(j2);
console.log(j2.releaseDate.getFullYear());
{"name":"leo","age":19,"marry":false,"none":null,"releaseDate":"2011-11-30T16:00:00.000Z"}
{name: "leo", age: 19, marry: false, none: null, releaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中國標準時間)}age: 19marry: falsename: "leo"none: nullreleaseDate: Thu Dec 01 2011 00:00:00 GMT+0800 (中國標準時間) {}__proto__: Object
2011

還原函數在遇到"releaseDate"鍵時,會基於相應的值創建一個新的 Date 對象。結果就是
bookCopy.releaseDate 屬性中會保存一個 Date 對象。正因為如此,才能基於這個對象調用
getFullYear()方法。

JS高程3:JSON