XML——這種用于表示客戶端與服務(wù)器間數(shù)據(jù)交換有效負(fù)載的格式,幾乎已經(jīng)成了Web services的同義詞。我們知道AJAX技術(shù)能夠使得每一次請(qǐng)求更加迅捷,對(duì)于每一次請(qǐng)求返回的不是整個(gè)頁面,也僅僅是所需要返回的數(shù)據(jù)。然而,由于Ajax和REST技術(shù)的出現(xiàn)影響了應(yīng)用程序架構(gòu),這迫使人們開始尋求`XML的替代品,如:JavaScript Object Notation(JSON)。
JSON 作為一種更輕、更友好的 Web services客戶端的格式(多采用瀏覽器的形式或訪問 REST風(fēng)格 Web服務(wù)的Ajax應(yīng)用程序的形式)引起了 Web 服務(wù)供應(yīng)商的注意。通常AJAX通過返回XML格式的數(shù)據(jù),然后再通過客戶端復(fù)雜的JavaScript腳本解析和渲染這些XML格式的數(shù)據(jù)。JSON(讀Jason)是為了能夠使得數(shù)據(jù)格式成為一種標(biāo)準(zhǔn),更簡單的被JavaScript解析。
本文將闡述JSON在Web services設(shè)計(jì)中備受推崇的原因,以及它作為XML替代方案的主要優(yōu)勢和局限性。文中還會(huì)深入探討:隨著相應(yīng)的Web 服務(wù)客戶端選擇使用JSON,如何才能便捷地在Java Web services中生成JSON輸出。
json的官方文檔:
http://www.json.org/json-zh.htmlJSON的優(yōu)點(diǎn)
- 輕量級(jí)的數(shù)據(jù)交換格式
- 人們讀寫更加容易
- 易于機(jī)器的解析和生成
- 能夠通過JavaScript中eval()函數(shù)解析JSON
- JSON支持多語言。包括:ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.
JSON語法是一種用于傳輸和生成數(shù)據(jù)的協(xié)定,很類似于C家族的語言,所以很容易被C家族的語言所解析。
對(duì)象:對(duì)象包含再{}之間
屬性:采用Key-Value對(duì)來表示。屬性之間使用逗號(hào)分開。 string : value
數(shù)組:數(shù)組存放再[]之間 [ elements ]
元素:元素之間用逗號(hào)分開
值:值可以是字符串,數(shù)字,對(duì)象,數(shù)組,true,false,null
例子:
JSON
{"menu": {
"id": "file",
"value": "File:",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"} ]
}
}}
XML
<menu id="file" value="File" >
<popup>
<menuitem value="New" onclick="CreateNewDoc()" />
<menuitem value="Open" onclick="OpenDoc()" />
<menuitem value="Close" onclick="CloseDoc()" />
</popup>
</menu>
XML 的作用是格式化數(shù)據(jù)內(nèi)容。如果我們不用XML還有什么更好的方法嗎?這個(gè)答案是JSON。介紹JSON之前我先介紹一下JavaScript這門腳本語 言。腳本語言自身有動(dòng)態(tài)執(zhí)行的天賦。即我們可以把想要執(zhí)行的語句放在字符串里,通過eval()這個(gè)動(dòng)態(tài)執(zhí)行函數(shù)來執(zhí)行。字符串里的內(nèi)容會(huì)像我們寫的腳本 一樣被執(zhí)行。
<HTML>
<HEAD>
<TITLE>eval example 1</TITLE>
</HEAD>
<BODY>
<script>
str = "alert('hello')";
eval(str);
</script>
</BODY>
</HTML>
打開頁面會(huì)彈出hello窗口。我們可以在字符串中放任何腳本語句,包括聲明語句,等等一系列東西,比如:
<HTML>
<HEAD>
<TITLE>eval example 2</TITLE>
</HEAD>
<BODY>
<script>
define = "{name:'Michael',email:'17bity@gmail.com'}";
eval("data = "+define);
alert("name:"+data.name);
alert("email:"+data.email);
</script>
</BODY>
</HTML>
如果我們?cè)诤笈_(tái)異步傳來的文本是JavaScript的聲明語句,那么不是一條eval方法就能解析了?對(duì)于解析復(fù)雜的XML,這樣的效率是多么大的提高啊!現(xiàn)在就來告訴你什么是JSON:JavaScript Object Notation。我更愿意把它翻譯為JavaScript對(duì)象聲明。比如要從后臺(tái)載入一些通訊錄的信息,如果寫成XML,如下:
<contact>
<friend>
<name>Michael</name>
<email>17bity@gmail.com</email>
<homepage>http://www.jialing.net</homepage>
</friend>
<friend>
<name>John</name>
<email>john@gmail.com</email>
<homepage>http://www.john.com</homepage>
</friend>
<friend>
<name>Peggy</name>
<email>peggy@gmail.com</email>
<homepage>http://www.peggy.com</homepage>
</friend>
</contact>
而寫成JSON呢,就如下面:
[
{
name:"Michael",
email:"17bity@gmail.com",
homepage:"http://www.jialing.net"
},
{
name:"John",
email:"john@gmail.com",
homepage:"http://www.jobn.com"
},
{
name:"Peggy",
email:"peggy@gmail.com",
homepage:"http://www.peggy.com"
}
]
簡單的不只是表達(dá)上,最重要的是可以丟棄讓人暈頭轉(zhuǎn)向的DOM解析了。因?yàn)橹灰螶avaScript的聲明規(guī)范,JavaScrip會(huì)自動(dòng)幫你解析好 的。Ajax中使用JSON的基本方法是前臺(tái)載入后臺(tái)聲明JavaScript對(duì)象的字符串,用eval方法來將它轉(zhuǎn)為實(shí)際的對(duì)象,最后通過 DHTML更新頁面信息。