在開始介紹本文要介紹的兩個方法之前,我們先來看一下什麼是JSON對象。
一、JSON對象
1、什麼是json?
JSON(JavaScript Object Notation)javscript對象标記,是一種輕量級的資料交換格式。簡單來說,json就是用JavaScript文法寫的一個特殊的标記字元串。
2、json的作用
(1)簡化用JavaScript定義對象的方式;
(2)也能用在AJAX中,做為資料載體之一。
JSON之是以流行,擁有與JavaScript類似的文法并不是全部原因。更重要的一個原因是,可以把JSON資料結構解析為有用的JavaScript對象。
3、json的文法作用
(1)一個對象用{}表示;
(2)一對屬性之間,使用 ':'來分隔,屬性結束後,使用 ',' 來分隔,最後一個除外;
(3)一個數組,使用[]符号;
JSON對象有兩個方法:stringify()與parse()。在最簡單的情況下,這兩個方法分别用于把JavaScript對象序列化為JSON字元串和把JSON字元串解析為原生JavaScript值。
二、JSON.stringify() 序列化選項
方法: JSON.stringify(object[, replacer[, space]])
作用: 使用JSON.stringify()方法可以将JSON對象轉為字元串。
參數:
1)object參數:是要轉為字元串的JSON對象。
2)replacer參數:可選,這個參數是一個過濾器,可以是改變字元串轉換過程的函數,也可以是一組String和Number對 象。
這些對象用作一個白名單,用于選擇要轉換為字元串的對象的屬性。如果這個值是空或沒有提供,則在所得的JSON字元串中包含對象的所有屬性。
3)space參數:可選,是一個String或Number對象,用于把空白插入輸出的JSON字元串,以提高可讀性。如果這是一個數值,則表示用作空白的空格字元數;如果該數值大于10,就取其值為10;小于1的值表示不應使用空格。如果這是一個字元串(如果該字元串多于10個字元,就取前10個字元),就把該字元串用作空白。如果沒有提供這個參數(或者為空),就不使用空白。
接下來詳細說明這個方法的使用。 1、過濾結果 我們在上面指出,JSON.stringify()可以接收兩個參數,如果過濾器參數是一個數組,那麼JSON.stringify()的結果中将隻包含數組中列出的屬性。 我們來舉一個例子。
var book = {
"title":"JavaScript 進階程式設計",
"authors":[
"Nicholas C. Zakas"
],
"edition":3,
"year":2012
};
var jsonBook = JSON.stringify(book,["title","edition"]);
console.log(jsonBook);
輸出結果: {"title":"JavaScript 進階程式設計","edition":3} 我們在程式中JSON.stringify()的第二個參數設定為一個數組,其中包含兩個字元串:“title”和“edition”。這兩個屬性與将要序列化的對象中的屬性是對應的,是以在傳回的結果字元串中,就隻會包含這兩個屬性。
如果第二個參數是函數,那麼結果就會稍有不同。傳入的函數接收兩個參數,屬性名和屬性值。根據屬性名就可以知道應該如何處理要序列化的對象中的屬性。屬性名隻能是字元串,而在值并非鍵值對結構的值時,鍵名可以是空字元串。 為了改變序列化對象的結果,函數傳回的值就是相應鍵的值。不過需要注意的是,如果函數傳回了undefined,那麼相應的屬性就會被忽略。 同樣的來看一個例子。
var book = {
"title":"JavaScript 進階程式設計",
"authors":[
"Nicholas C. Zakas"
],
"edition":3,
"year":2012
};
var jsonbook = JSON.stringify(book,function(key,value){
switch(key){
case "title":
return value;
case "authors":
return value;
case "edition":
return undefined;
case "year":
return 2015;
default:
return value;
}
});
console.log(jsonbook);
輸出結果: {"title":"JavaScript 進階程式設計","authors":["Nicholas C. Zakas"],"year":2015} 要序列化的對象中的每一個對象都要經過過濾器,是以數組中的每個帶有這些屬性的對象經過過濾之後,每個對象都隻會包含“title”、"authors"、"year"。
2、字元串縮進 JSON.stringify()方法的第三個參數用于控制結果中的縮進和空白符。如果這個參數是一個數值,那它表示的是每個級别縮進的空格數。
舉一個例子。
var book = {
"title":"JavaScript 進階程式設計",
"authors":[
"Nicholas C. Zakas"
],
"edition":3,
"year":2012
};
var jsonbook = JSON.stringify(book,null,4);
console.log(jsonbook);
輸出結果: {
"title": "JavaScript 進階程式設計",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2012
}
這個例子可以讓每個級别縮進4個空格。
如果縮進參數是一個字元串而非數值,則這個字元串将在JSON字元串中被用作縮進字元。在使用字元串的情況下,可以将縮進字元設定為制表符,或者短劃線之類的任意字元,如下所示。
var book = {
"title":"JavaScript 進階程式設計",
"authors":[
"Nicholas C. Zakas"
],
"edition":3,
"year":2012
};
var jsonbook = JSON.stringify(book,null,'--');
console.log(jsonbook);
輸出結果: {
--"title": "JavaScript 進階程式設計",
--"authors": [
----"Nicholas C. Zakas"
--],
--"edition": 3,
--"year": 2012
}
三、JSON.parse() 解析選項 作用:将 JavaScript 對象表示法 (JSON) 字元串轉換為對象。
文法:JSON.parse(text [, reviver])
參數
1)text:必需。 一個有效的 JSON 字元串。
2)reviver:可選。 一個轉換結果的函數,這個函數被稱為還原函數,這個函數接收兩個參數,一個鍵和一個值。 将為對象的每個成員調用此函數。 如果成員包含嵌套對象,則先于父對象轉換嵌套對象。 對于每個成員,會發生以下情況:
- 如果 reviver 傳回一個有效值,則成員值将替換為轉換後的值。
- 如果 reviver 傳回它接收的相同值,則不修改成員值。
- 如果 reviver 傳回undefined,則删除成員。(我在FF和chrome下試驗的是傳回undefined後,會删除成員,傳回null,隻會指派為null)
傳回值:一個對象或數組。
下面寫兩個簡單的例子說明。 執行個體一:使用 JSON.parse 将 JSON 字元串轉換為對象
var jsontext = '{"title":"JavaScript 進階程式設計","authors":["Nicholas C. Zakas"],"year":2015}';
var contact = JSON.parse(jsontext);
console.log(contact.title + ", " + contact.authors + ", "+ contact.year);
執行個體二:使用 JSON.parse 反序列化 ISO 格式的日期字元串, 将傳回Date格式對象,然後調用getFullYear()方法。
var book = {
"title":"JavaScript 進階程式設計",
"authors":[
"Nicholas C. Zakas"
],
"edition":3,
"year":2011,
releaseDate:new Date(2011,11,1)
};
var jsonBook = JSON.stringify(book);
var bookCopy = JSON.parse(jsonBook,function(key,value){
if(key == "releaseDate"){
return new Date(value);
}else{
return value;
}
});
console.log(bookCopy.releaseDate.getFullYear());