JSON的全稱是JavaScript Object Notation,即JavaScript對象符号,它是一種輕量級的資料交換格式。JSON的資料格式既适合人來讀/寫,也适合計算機本身解析和生成。最早的時候,JSON是JavaScript語言的資料交換格式,後來慢慢發展成一種語言無關的資料交換格式,這一點非常類似于XML。
JSON主要在類似于C的程式設計語言中廣泛使用,這些語言包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON提供了多種語言之間完成資料交換的能力,是以,JSON也是一種非常理想的資料交換格式。JSON主要有如下兩種資料結構:
Ø 由key-value對組成的資料結構,這種資料結構在不同的語言中有不同的實作。例如,在JavaScript中是一個對象,在Java中是一種Map結構,在C語言中,則是一個struct。在其他語言中,可能有record、dictionary、hash table等。
Ø 有序集合。這種資料結構在不同語言中,可能有list、vector、數組和序列等實作。
上面的兩種資料結構在不同的語言中都有對應的實作。是以,這種簡便的資料表示方式完全可以實作跨語言,是以可以作為程式設計語言中通用的資料交換格式。在JavaScript中主要有兩種JSON的文法,一種用于建立對象,另一種用于建立數組。
1.使用JSON文法建立對象
使用JSON文法建立對象是一種更簡單的方式,使用JSON文法可避免書寫函數,也可避免使用new關鍵字,而是直接擷取一個JavaScript對象。對于早期的JavaScript版本,如果要使用JavaScript建立一個對象,通常情況下可能會這樣寫:
//定義一個函數,作為構造器
function Person(name, sex)
{
this.name = name;
this.sex = sex;
}
//建立一個Person執行個體
var p = new Person(‘yeeku’, ‘male’);
//輸出Person執行個體
alert(p.name);
從JavaScript 1.2開始,建立對象有了一種更快捷的文法,文法如下:
var p = { "name": yeeku’,
"sex" : ‘male’};
alert(p);
這種文法就是一種JSON文法。顯然,使用JSON文法建立對象更加簡捷、友善。圖4.35顯示了這種文法示意。
<a href="http://blog.51cto.com/attachment/201206/141533522.jpg" target="_blank"></a>
在圖4.35中,建立對象object時,總以{開始,以}結束,對象的每個屬性名和屬性值之間以英文冒号(:)隔開,多個屬性定義之間以英文逗号(,)隔開。文法格式如下:
object =
propertyName1 : propertyValue1 ,
propertyName2 : propertyValue2 ,
...
必須注意的是,并不是每個屬性定義後面都有英文逗号(,),必須後面還有屬性定義時才需要逗号(,)。是以,下面的對象定義是錯誤的:
person =
name : ‘yeeku’,
sex : ‘male’,
因為sex屬性定義後多出一個英文逗号,最後一個屬性定義的後面直接以 } 結束了,不再有英文逗号(,)。
當然,使用JSON文法建立JavaScript對象時,屬性值不僅可以是普通字元串,也可以是任何基本資料類型,還可以是函數、數組,甚至是另外一個JSON文法建立的對象。例如:
name : 'yeeku',
sex : 'male',
//使用JSON文法為其指定一個屬性
son : {
name: 'nono',
grade:1
},
//使用JSON文法為person直接配置設定一個方法
info : function()
{
document.writeln("姓名:" + this.name + "性别:" + this.sex);
}
使用JSON文法建立數組也是非常常見的情形,在早期的JavaScript文法裡,我們通過如下方式來建立數組。
//建立數組對象
var a = new Array();
//為數組元素指派
a[0] = 'yeeku';
a[1] = 'nono';
或者,通過如下方式建立數組:
//建立數組對象時直接指派
var a = new Array('yeeku', 'nono');
但如果我們使用JSON文法,則可以通過如下方式建立數組:
//使用JSON文法建立數組
var a = ['yeeku', 'nono'];
圖4.36是JSON建立數組的文法示意。
<a href="http://blog.51cto.com/attachment/201206/144544207.jpg" target="_blank"></a>
正如圖4.36中所見到的,JSON建立數組總是以英文方括号([)開始,然後依次放入數組元素,元素與元素之間以英文逗号(,)隔開,最後一個數組元素後面不需要英文逗号,但以英文反方括号(])結束。使用JSON建立數組的文法格式如下:
arr = [value1 , value 2 ...]
與JSON文法建立對象相似的是,數組的最後一個元素後面不能有逗号(,)。
鑒于JSON文法的簡單易用,而且作為資料傳輸載體時,資料傳輸量更小,是以在Ajax互動中,往往不使用XML作為資料交換格式,而是采用JSON作為資料交換格式。假設需要交換一個對象person,其name屬性為yeeku,gender屬性為male,age屬性為29,使用JSON文法可以簡單寫成如下形式:
name:'yeeku',
gender:'male',
age:29
但如果使用XML資料交換格式,則需要采用如下格式:
<person>
<name>yeeku</name>
<gender>male</gender>
<age>29</age>
</person>
對比這兩種表示方式,第一種方式明顯比第二種方式更加簡潔,資料傳輸量也更小。
當伺服器傳回一個滿足JSON格式的字元串後,我們可以利用json擴充的方法将該字元串轉換成一個JavaScript對象。登入http://www.json.org/json2.js站點,下載下傳json2.js檔案,該檔案提供了一個全局的JSON對象,該對象包含兩個方法:stringify和parse,其中前者負責把一個JSON對象轉換成JSON格式的字元串,而後者則負責把JSON格式字元串轉換成JSON對象。