一.什麼是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,如需轉載請自行聯系原作者