天天看點

JSONJavaScript之JSON

一.什麼是JSON?

   JSON的英文全程是JavaScript Object Notation(即JavaScript對象表示法),它是一種資料交換格式。是由Douglas Crockfordba把它作為IETF RFC4627送出給IETF的。我們最初需要知道的是:

JSON是一種資料格式,而不是一種程式設計語言。

JSON并不從屬于JavaScript,因為不僅JavaScript可以試用JSON,其他許多程式設計語言都可以使用JSON。

二.JSON的基本文法。

  JSON包括簡單值、對象值以及數組。

  1.簡單值:與JavaScript相同,JSON支援字元串、數組、布爾值和null,但它不支援undefined。 比如說 8 ,這個數組便是一個最簡單的JSON資料格式;“Hello Wrld”,這個字元串同樣也是一個簡單的JSON資料格式。但是JSON和JavaScript有一個很大的差別在于:JSON使用字元串時必須使用雙引号,如果使用單引号會導緻文法錯誤。

   2.對象:它是JSON中的一中複雜資料類型。JSON中的對象和JavaScript的對象字面量是十分相似的。

     首先,我們給出一個JavaScript中的對象字面量:

var Person={

        name:"Mr Zhu",

        age:21

};

  接着我們給出一個用JSON表示的對象:

    "name":"Mr Zhu",

    "age":21

}

通過比較,我們可以看出,兩者的主要差別

首先,JSON中沒有聲明變量。(因為JSON是不支援變量的,除此之外,JSON同樣不支援函數和對象執行個體);

其次,JSON的對象末尾沒有分号(因為我剛剛說過,JSON不是從屬于JavaScript的)

最後,JSON要求屬性名一定要有雙引号括起來。

  3.數組:它是JSON中的另外一種複雜的資料類型。它采用的文法就是使用JavaScript中的數組字面量形式。

         比如:在JavaScript中,我們可以這樣表示一個數組:

var value=["Mr Zhu",20,true];

     而JSON是這樣表達資料的:

["Mr Zhu",20,true]

 通過比較,我們可以得出JSON與JavaScript兩者關于數組的主要差別

JavaScript表示數組不僅可以用字面量方法,還可以使用構造函數的方法;而JSON隻能使用字面量方法。

JSON中不支援變量,且不應該在語句結束之後使用分号。

三.将JavaScript對象序列化為JSON字元串。

  序列化過程需要使用JSON對象的stringify()方法。該方法接受三個參數,分别是将要序列化的對象的引用、過濾器(數組或函數)以及一個決定是否在JSON字元字元串中保留縮進的選項。

  1.首先,我來談談第一個參數。先給出以下JavaScript對象字面量代碼:

    

var person={

    name:"Mr Zhu",

    age:21,

    year:2016

接下來我們就可以使用JSON.stringify()方法來序列化這個對象:

var jsonText=JSON.stringify(person);

 這句代碼接受了第一個參數(這個參數時必選的,沒有其他兩個,說明其他兩個不是必選的),即将JavaScript對象轉化為了JSON字面量儲存在了jsonText變量中。預設情況下,JSON.stringify()輸出的JSON字元串不包含任何空格字元或縮進,是以實際上儲存在jsonText變量中的字元串如下:

{“name”:"Mr Zhu","age":21,“year”:2016}

  2.過濾器參數。文章的開頭提到,過濾器參數可以是數組也可以是函數。

    首先,讓我們先學習過濾器參數時數組的情況。觀察以下代碼:

};<br>var jsonText=JSON.stringify(person,["name","age"]);

 這時,儲存在jsonText變量中的JSON字元串為:

{"name":"Mr Zhu","age":21}

 也就是說,在過濾器數組參數中的屬性名所對應的屬性被過濾後剩了下來,而year屬性則被過濾掉了,這便是我們稱之為過濾器的原因。

    接着,讓我們學習第二個參數為函數(這個函數被稱為替換函數)的情況。觀察以下代碼:

var jsonText=JSON.springify(person,function(key,value){

         switch(key){

                    case "age":

                          return  18;

                    case "year":

                          return undefined;

                    default:

                          return value;

});                                                           

這是,儲存在jsonText變量中的JSON字元串成了:

{"name":"Mr Zhu","age":18}

 注意:函數過濾器根據傳入的鍵來決定結果。且要序列化的對象中的每一個對象都要經過過濾器(是以switch語句中沒有break)。比如這個例子,我們需要對JavaScript對象序列化為JSON字元串,由于第二個參數是函數,那麼其中的每一個屬性都會經過這個過濾器,傳入鍵名,return函數中設定的value以改變預設的JSON字元串,如第一個傳入鍵名“name”(我們可以了解為屬性名),函數中沒有對其有特定要求,這時,就是default了,傳回value(即不作出任何改變);第二個傳入“age”,函數中要求傳回18,這時輸出的字元串就會被修改為18了;接下來傳入“year”,根據函數應當傳回undefined,但是我之前說過,JSON是不支援undefined這個類型的,于是,序列化的JSON字元串會将year這個屬性删除。

  3.字元串縮進參數。

  首先,先觀察以下代碼:

var jsonText=JSON.springify(person,null,4);

 首先注意到,springify()方法的第二次過濾器參數為null,這表示我們不使用過濾器。用null占位以免引起歧義。其次,我們注意到第三個參數為4,這是說在得到的JSON字元串中縮進四個空格。如下:

    "age":21,

    "year":2016

 我們還應該注意到,該方法在結果字元串中插入了換行符以提高可讀性(隻縮進不換行意義不大)。

 如果我們将第三個參數換為字元串而不是數字,比如:

var jsonText=JSON.springify(person,null,"----");

 這時得到的結果是:

----"name":"Mr Zhu",

----"age":21,

----"year":2016

 即字元串将代替空格完成縮進任務。

  4.最後,我再來談談toJSON()方法,雖然這不是”第四個參數“,但是該方法也是将JavaScript對象序列化為JSON字元串,并且同樣具有過濾器的作用。  

  先看以下執行個體:

    toJSON:function(){

               return this.name;

    }

var jsonText=JSON.stringify(person,null,4);

 請注意:toJSON()方法是用在JavaScript的對象字面量中的。 我們可以得到以下結果:

    "name":"Mr Zhu"

 即最終就隻剩下”name“了,便是toJSON()方法的過濾器作用。

!!! 在序列化為JSON字元串時,一定要了解序列化的内部順序:

如果存在toJSON()函數且能通過它取得有效的值,則調用該方法,否則,傳回對象本身。

如果提供了第二個參數,則需要運用這個函數過濾器的值,且傳入函數過濾器的值就是 1 傳回的值。

對 2 傳回的每個值進行相應的序列化。

如果提供了第三個參數,執行相應的格式化。

四.将JSON字元串解析為JavaScript值。

  将JSON字元串解析為JavaScript值需要JSON.parse()方法,該方法接收兩個參數,第一個參數時儲存JSON字元串的變量,第二個參數是一個函數。第一個參數沒什麼好說的,主要是第二個參數,它被稱為還原函數,這個函數也接受兩個參數,一個鍵和一個值,并且傳回一個值。這個還原函數同替換函數一樣,将在每個鍵值對兒上調用。比如:

    year:2016,

    successDate:new Date(2016,9,18)

var personCopy=JSON.parse(jsonText,function(key,value){

    if(key="successDate"){

       return new Date(value);

    }else{

       return value;

});

alert(personCopy.successDate.getFullyear());

   首先,我先為對象增加了一個seccessDate屬性,該屬性儲存着一個Date對象,然後序列化為JSON字元串,最後再解析為JavaScript值,解析的過程中,鍵值對兒會一次傳入還原函數中,name 、age、year不會改變,而successDate會基于相應的值建立一個新的Date()對象。這樣,我們最後才能基于這個對象調用getFullYear()方法。

      本文轉自zsdnr  51CTO部落格,原文連結:http://blog.51cto.com/12942149/1929377,如需轉載請自行聯系原作者

繼續閱讀