向服務器發出Ajax請求時,可以以兩種不同的方式從服務器響應檢索數據:一種是使用XMLHttpRequest對象的reponseXML屬性訪問XML格式的數據;一種是XMLHttpRequest對象的responseText屬性訪問字符串格式的數據。當前,XML是進行數據傳輸的標准語言,但是使用XML的缺點之一是很難對它進行解析並提取要添加到頁面的數據。
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,我們稱之為JavaScript對象表示法。使用JSON進行數據傳輸的優勢之一是JSON實際上就是JavaScript。它基於ECMAScript第3版中JavaScript對象字面量語法子集的一種文本格式。這表示可以使用responseText從服務器中檢索JSON數據,然后再使用JavaScript的eval()方法將JSON字符串轉換成JavaScript對象,那么,使用附加JavaScript就可以很地從該對象中提取數據,而不需要處理DOM。
另外,也有針對大部分編程語言(包括C++,C#,ColdFusion、Java、Perl、PHP和Python)的JSON庫,這些庫能將上述語言格式化數據轉換成JSON格式。
盡管有許多宣傳關於XML如何擁有跨平台,跨語言的優勢,然而,除非應用於Web Services,否則,在普通的Web應用中,開發都經常為XML的解析作秀了腦筋,無論是服務器端生成或處理XML,還是客戶端用JavaScript解析XML,都常常導致復雜的代碼,極低的開發效率。實際上,對於大多數Web應用來說,根本不需要要復雜的XML來傳輸數據,XML的擴展性很少具有優勢,許多Ajax應用甚至直接返回HTML片段來構建動態Web頁面。和返回XML並解析它相比,返回HTML片段大大降低了系統的復雜性,但同時缺少了一定的靈活性。XML使用元素、屬性、實體和其他結構。JSON不是文檔格式,因此它不需要這些附加結構。因為JSON數據只包括“名-值”對(對象)或值(數組),所以JSON數據比同等的XML數據占用更少的空間,執行速度更快。
(一)JSON語法
JSON建構於兩種結構:
對象——名稱/值對的集合。不同的語言中,它被理解為對象,紀錄,結構,字典,哈希表,有鍵列表(keyed list),或者關聯數組。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
數組——值的有序列表。在大部分語言中,它被理解為數組。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
JSON沒有變量或其他控制結構。JSON只用於數據傳輸。
JSON語法是基於對面字面量和數組字面量的JavaScript語法。當使用字面量時,將包括數據本身,但不包括生成數據的表達式。
1、 數據類型
JSON數據結構包含以下數據類型:字符、數字、布爾值(true/false)、null、對象,數組。
JSON字符串必須使用雙引號括起來。它們使用標准的JavaScript轉義序列。因此在以下列字符的前面要添加一個反斜線:
JSON具有以下這些形式:”(引號)、b(空格)、n(新行)、f(換頁)、r(回車)、t(水平定位)、u(為Unicode字符增加4個數位)、\(反斜線符號)、/(正斜杠符號)。
2、對象字面量
JSON使用字面量來表示對象,如果有一個以上的成員對象,則在JSON中,可以將其表示為一個包含擁有兩個對象的數組的對象。下列代碼顯示JOSN文本形式的member對象:
{“memeber”:[
{
“name”:”Tom”,
“age”:22,
“country”:”USA”
},
{
“name”:”WangMing”,
“age”:25,
“country”:”China”
}
]
}
3、使用JSON解析器
可以使用JSON解析器從對象和數組中創建JSON文本或者JSON文本中創建對象和數組。JSON站占www.json.rog/json.js上提供有JSON解析器,通過將下列代碼加入到頁面的頭部上即可使用。JSON解析器提供了兩個函數:toJSONString()和parseJSON()。
toJSONString()方法被添加到JavaScript Object和Array定義中,該方法能將JavaScript對象或數組轉換成JSON文本。不必將對象或數組轉換成字面量就能使用該方法。
parseJSON()方法能從JSON文本中創建對象或數組。
(二)使用XMLHttpRequest對象創建JSON數據請求
1、創建請求
如果直接請求服務器上一個JSON文件中的JSON數據,則可以利用文件名來請求JSON文件。
respone.open(“GET”,”classes.txt”,true);
在這種情況下,classes.txt是JSON數據文件的名稱,request是創建用來存放XMLHttpRequest對象的變量。
2、 解析響應
一旦接受服務器的JSON數據,就可以采用兩種不同的方式解析該響應。可以使用JavaScript的內置函數eval(),或者為了進一步的安全,使用JSON解析器代替。
eval()方法可以把JavaScript字符串當作參數,還可以將該字符串轉換成對象,或作為命令動作。如果使用XMLHttpRequest對象的responseText屬性請求JSON數據,那么使用eval()將JSON文本字符串轉換成JavaScript對象。因為JSON字符串常包包含花括號,所以用圓括號來括住JSON字符串,以表明字它是一個求值表達式,而不是一個要運行的命令。
var jsonResp=request.responseText;
jsonResp=eval(“(”+jsonResp+”)”);
如果Web服務器既提供JSON數據也提供請求頁面,則適合選用eval()方法。如果涉及安全,則適合使用JSON解析器。JSON解析器只作用於JSON文本,並且不執行其他JavaScript。在這種情況下,可以使用responseText,但要使用parseJSON()方法將JSON文本字符串轉換成JavaScript對象。要訪問parseJOSN函數,需要要添加引用json.js文件到頁面中。
var jsonResp=request.responseText;
jsonResp=jsonResp.parseJSON();
下面以實例來說明在JavaScript中簡單使用JSON:
<script type="text/javascript">
var user =[
{
"name":”shenmiweiyi”,
"QQ":306451129,
"email":”shenmiweiyi@163.com”
"address":
[
{"City":"ZhengZhou","ZipCode":"450000"},
{"City":"BeiJing","ZipCode":"100000"}
]
},
{
"name":”kehao”,
"QQ":254892313,
"email":”kehao@163.com”
"address":
[
{"City":"ShangHai","ZipCode":"200000"},
{"City":"GuangZhou","ZipCode":"510000"}
]
}
]
alert(user[0].name+”的Email是:”user[0].email); //outputs shenmiweiyi的Email是:shenmiweiyi@163.com
alert(user[1].name+”住在:”user[1].address[0].city) //outputs kehao住在:ShangHai
</script>
JSON已經是JavaScript標准的一部分。目前,主流的瀏覽器對JSON支持都非常完美,應用JSON,我們可以從XML的解析中擺脫出來,對那些應用Ajax的Web2.0網站來說,JSON確實是目前最靈活的輕量級方案。