轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-17 17:09:43.000|閱讀 579 次
概述:AJAX這個(gè)詞語(yǔ)已經(jīng)火爆一陣了,這個(gè)詞語(yǔ)中的X就是表示XML,也就是我們通常使用的服務(wù)器端和客戶端進(jìn)行交互的數(shù)據(jù)傳輸介質(zhì)。本文將介紹如何使用JSON做AJAX的數(shù)據(jù)傳輸介質(zhì),希望對(duì)大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
AJAX這個(gè)詞語(yǔ)已經(jīng)火爆一陣了,這個(gè)詞語(yǔ)中的X就是表示XML,也就是我們通常使用的服務(wù)器端和客戶端進(jìn)行交互的數(shù)據(jù)傳輸介質(zhì)。當(dāng)然XML有著開(kāi)放、平臺(tái)無(wú)關(guān)性等當(dāng)前我們很注重的幾個(gè)方面的優(yōu)勢(shì),而且無(wú)論在哪個(gè)方面都可以靈活的應(yīng)用,甚至數(shù)據(jù)庫(kù)都有采用XML的了(比如SQLSERVER和ORACLE等)。
當(dāng)然,有優(yōu)勢(shì)并不一定代表在所有方面都OK,JSON-JavaScript Object Notation,一個(gè)也是最近比較流行的數(shù)據(jù)表示工具,在AJAX框架(比如DOJO等)中都有所應(yīng)用,最近我也在我的權(quán)限系統(tǒng)中大量的使用了JSON作為前臺(tái)JS和服務(wù)器進(jìn)行數(shù)據(jù)庫(kù)交互的平臺(tái)。先看一個(gè)簡(jiǎn)單的例子:
比如我要從服務(wù)器端返回?cái)?shù)據(jù)(2個(gè)屬性,success和message,表示執(zhí)行成功與否和返回的提示信息),那么使用XML就是如下表示:
<?xml version="1.0" encoding="GBK"?>
<Root>
<success>true</success>
<message><![CDATA[操作成功!]]></message>
</Root>
那么我們?cè)诳蛻舳耸褂肑S就應(yīng)該如此來(lái)獲取數(shù)據(jù)了,如下:
function(xmlHttp)
{
var xml = xmlHttp.responseXML; // 獲取服務(wù)器端返回的XML數(shù)據(jù)流
var success = xml.getElementsByTagName("success")[0].firstChild.nodeValue;
var message = xml.getElementsByTagName("message")[0].firstChild.nodeValue;
……
}
我先不評(píng)論這兩個(gè)代碼,我們?cè)倏词褂肑SON如何表示,首先,在服務(wù)器端我們返回的字符串表示如下:
{"success":true,"message":"操作成功!"}
那么我們?cè)诳蛻舳擞衷撊绾芜M(jìn)行解析呢?看如下代碼:
function(xmlHttp)
{
var val = xmlHttp.responseText; // 獲取服務(wù)器端返回的文本流
var obj = ; // 利用eval函數(shù)將返回的文本流轉(zhuǎn)換成JS對(duì)象
alert(obj.success); // 打印是否成功
alert(obj.message); // 打印服務(wù)器端返回的信息
}
看完上面的代碼后,大家有什么想法呢?呵呵,是不是覺(jué)得第一種表示又簡(jiǎn)單,又直觀呢?!而且從代碼的量上看,使用JSON可以明顯的減少客戶端的JS編程量,而且在同等的數(shù)據(jù)要求下,JSON的表示法肯定是要比XML表示法的字節(jié)數(shù)要少(上面XML分別是108個(gè)字符,JSON是34個(gè)字符),可以看到差別是明顯的,尤其是要表示的數(shù)據(jù)結(jié)構(gòu)更加復(fù)雜和多的時(shí)候。
大家對(duì)JSON也有了初步的了解,我就從實(shí)際的使用角度來(lái)給大家講講JSON,當(dāng)然,我這里不會(huì)原原本的照搬官方網(wǎng)站上的介紹(官方網(wǎng)站地址:)和圖片等資源信息,這大家可以在baidu上一搜一大片,而且也可以在官方網(wǎng)站上了解什么是JSON。
我這里也給大家簡(jiǎn)單的說(shuō)下,怎么表示JSON對(duì)象,我們直接在JS中表示就如下:
var obj = {
"a":"a1",
"b":"b1",
"c":"c1"
}
使用如上的表示就可以表示JS中的一個(gè)對(duì)象了,那么訪問(wèn)就很簡(jiǎn)單了,直接obj.a,obj.b就可以了。當(dāng)然也可以嵌套表示的,即對(duì)象里再嵌入對(duì)象,如下:
var obj = {
"a":"a1",
"b":{
"b1":"b11",
"b2":"b22"
},
"c":"c1"
}
上面就表示了obj對(duì)象中嵌套了一個(gè)b對(duì)象,訪問(wèn)就按照層次來(lái)訪問(wèn)即可,比如obj.b.b1就可以得到值b11。可以看到使用JSON可以很方便的表示一個(gè)對(duì)象,而且JSON對(duì)象的表示法和JS的內(nèi)置對(duì)象的表示是一樣的,這樣也就注定了使用eval函數(shù)來(lái)解析JSON字符串為對(duì)象時(shí)會(huì)比XML解析來(lái)的快,事實(shí)上也證明確實(shí)如此,大家可以使用一個(gè)XML和一個(gè)JSON來(lái)做個(gè)解析例子(當(dāng)然要是大對(duì)象了)。
上面說(shuō)的是我們直接在客戶端中寫(xiě)JS對(duì)象,通常我們都會(huì)有應(yīng)用是用來(lái)和服務(wù)器打交道的,就像我們文章最前面說(shuō)的那樣。那么我們?cè)诜?wù)器端怎么來(lái)輸出JSON字符串呢?不會(huì)是手動(dòng)的一個(gè)個(gè)的加吧?呵,當(dāng)然不是這樣了,要是那樣的話,這樣介紹也就沒(méi)必要了哈,在服務(wù)器端我使用的是JSON-LIB,這個(gè)大家可以從上進(jìn)行和查看,包里總共也才20來(lái)個(gè)類和接口左右,是非常輕巧的一個(gè)JAR包。JSON-LIB依賴如下公用包:
jakarta commons-lang 2.3
jakarta commons-beanutils 1.7.0
jakarta commons-collections 3.2
jakarta commons-logging 1.1
ezmorph 1.0.1
JSON-LIB可以很容易的將一個(gè)實(shí)體JavaBean對(duì)象轉(zhuǎn)換成一個(gè)JSON字符串形式,也可以從Map中獲取值并進(jìn)行轉(zhuǎn)換,我們看一段簡(jiǎn)單的代碼:
……
Map<String,Object> map = new HashMap<String,Object>();
map.put("a", "a1");
Map<String,String> tmp = new HashMap<String,String>();
tmp.put("b1", "b11");
tmp.put("b2", "b22");
map.put("b", tmp);
map.put("c", "c1");
JSONObject obj = JSONObject.fromMap(map);
System.out.println(obj);
……
我們運(yùn)行這段代碼,輸出結(jié)果如下:
{"a":"a1","c":"c1","b":{"b1":"b11","b2":"b22"}}
可以看到輸出結(jié)果和我們?cè)谏厦姹硎镜哪莻€(gè)嵌套對(duì)象是一樣的(只是順序不一樣而已,這個(gè)不影響),這樣我們就可以很容易的將普通的Java對(duì)象轉(zhuǎn)換成JSON對(duì)象了。這個(gè)JSON-LIB的API不多,也比較簡(jiǎn)單,相信大家多看看,然后自己寫(xiě)寫(xiě)摸索摸索就可以很容易的寫(xiě)出滿足自己要求的JSON對(duì)象了。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載