天天看點

JavaScript中JSON.stringify()與JSON.parse()

    在開始介紹本文要介紹的兩個方法之前,我們先來看一下什麼是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());
           

繼續閱讀