朱小凡,梅 明,熊 婷,王 吉吉,張 凱
(武漢科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北武漢 430065)
隨著3G時(shí)代的到來,為了讓手機(jī)用戶能夠在任何時(shí)候,任何地方,以任何形式查詢手機(jī)校園助手所提供的服務(wù),一種高效的辦法就是將應(yīng)用系統(tǒng)的功能拓展到手機(jī)終端,在手機(jī)上通過移動(dòng)網(wǎng)和互聯(lián)網(wǎng)訪問Web網(wǎng)站并處理各項(xiàng)業(yè)務(wù)。從用戶需求的角度來講,將手機(jī)校園助手提供的服務(wù)通過現(xiàn)代的先進(jìn)技術(shù)拓展到手機(jī)終端是一項(xiàng)具有極大潛在的用戶需求,而基于Android平臺(tái)的手機(jī)應(yīng)用已成為必然的發(fā)展趨勢,它是一個(gè)開放的手機(jī)平臺(tái),從發(fā)布到推廣,在短短的時(shí)間內(nèi)以驚人的速度占據(jù)大量的智能手機(jī)市場,而且將繼續(xù)擴(kuò)大其用戶量。通過對(duì)Android提供的API訪問Web服務(wù)器進(jìn)行數(shù)據(jù)傳輸?shù)难芯?認(rèn)為Android提供的技術(shù)在框架上有很大的優(yōu)勢,但是Android最常用的方式就是以XML格式的文件作為信息交換的媒介,這使其存在許多不足。首先,XML格式文件存儲(chǔ)了大量的冗余信息,相對(duì)于JSON格式的文件需要占用更多的帶寬。其次,XML的數(shù)據(jù)表示過于正規(guī)和繁瑣,對(duì)移動(dòng)和嵌入式應(yīng)用程序尤其如此,這使其對(duì)XML格式的文件進(jìn)行解析相比JSON格式的文件更復(fù)雜。因此,在具體提取數(shù)據(jù)和傳輸數(shù)據(jù)的細(xì)節(jié)上還需要增加新的技術(shù)來彌補(bǔ),而JSON是一種輕量級(jí)的數(shù)據(jù)傳輸格式,允許輕松地將JavaScript對(duì)象轉(zhuǎn)換成可以隨請(qǐng)求發(fā)送的數(shù)據(jù),在保障安全性的同時(shí),解決了XML的缺陷。
隨著智能手機(jī)的普遍使用,使用移動(dòng)終端訪問瀏覽器的需求量越來越大,人們獲取信息的途徑也越來越多,Servlet技術(shù)由于具有可移植性,穩(wěn)健性和易開發(fā)性而被廣泛應(yīng)用,它的主要功能在于交互式地瀏覽和修改數(shù)據(jù)生成動(dòng)態(tài)Web內(nèi)容,其過程為:客戶端發(fā)送請(qǐng)求至服務(wù)器端—→服務(wù)器將請(qǐng)求信息發(fā)送至Servlet—→Servlet生成響應(yīng)內(nèi)容并將其傳給Server—→服務(wù)器將響應(yīng)返回給客戶端。以實(shí)際項(xiàng)目中Android客戶端向?qū)W校教務(wù)系統(tǒng)的Web服務(wù)器發(fā)送HTTP的GET和POST請(qǐng)求為例來進(jìn)行說明,其系統(tǒng)框架設(shè)計(jì)如圖1。
圖1
在發(fā)送HTTP請(qǐng)求的過程中,使用JSON作為數(shù)據(jù)傳輸?shù)倪^程如下:
當(dāng)網(wǎng)頁由于頻繁訪問而使流量的消耗過大時(shí),和XML的數(shù)據(jù)傳輸格式相比,JSON作為一種更輕、更友好的Web Services客戶端的格式,大大增強(qiáng)了用戶體驗(yàn)。它不僅易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,其工作原理如下:當(dāng)學(xué)生通過手機(jī)客戶端使用HTTP協(xié)議發(fā)送已序列化的JSON消息到服務(wù)器端,服務(wù)器端通過反序列化JSON消息,根據(jù)客戶端請(qǐng)求進(jìn)行相應(yīng)的操作后,把請(qǐng)求的結(jié)果序列化成JSON消息返回給客戶端,客戶端獲取到返回的JSON消息后,反序列化成具體需要的數(shù)據(jù),從而大大提高了數(shù)據(jù)傳輸效率,節(jié)省了時(shí)間。
JSON相對(duì)于XML來講,數(shù)據(jù)的體積小,速度遠(yuǎn)遠(yuǎn)快于XML。JSON占用帶寬小,瀏覽器解析速度快,數(shù)據(jù)格式較簡單,都是壓縮的,而XML文件格式文件龐大,格式復(fù)雜,傳輸占用帶寬大,服務(wù)器端和客戶端都需要花費(fèi)大量代碼來解析XML。為了更好地比較JSON和XML的傳輸效率,我們通過使用JSON和XML兩種數(shù)據(jù)傳輸格式對(duì)同一個(gè)數(shù)據(jù)庫文件的學(xué)生信息進(jìn)行數(shù)據(jù)傳輸并記錄傳輸時(shí)間。其中:
1.JSON的數(shù)據(jù)傳輸格式如下:
2.XML的數(shù)據(jù)傳輸格式如下:
3.解析結(jié)果如圖(2)圖(3)所示
圖2 JSON解析結(jié)果
圖3 XML解析結(jié)果
由于網(wǎng)絡(luò)不穩(wěn)定因素,實(shí)驗(yàn)數(shù)據(jù)存在一定的波動(dòng),統(tǒng)計(jì)結(jié)果如表1:
表1 JSON和XML數(shù)據(jù)傳輸時(shí)間對(duì)比
實(shí)驗(yàn)數(shù)據(jù)表明,對(duì)于輕量級(jí)的數(shù)據(jù),JSON的傳輸效率明顯高于XML。這是因?yàn)樵贏ndroid開發(fā)框架中,數(shù)據(jù)持久層都是使用面向?qū)ο蟮膶?duì)象關(guān)系映射框架開發(fā)的,使開發(fā)著必須完全遵守面向?qū)ο蟮拈_發(fā)方法,但采用以XML格式文件作為信息交換媒介,需要將數(shù)據(jù)持久層查詢的對(duì)象映射為XML文件,然后傳送給Android客戶端,再由Android客戶端進(jìn)行解析并封裝成對(duì)象,或者與上述對(duì)象相反的過程。而JSON是利用JSON對(duì)象將其直接轉(zhuǎn)化為腳本,大大提高了其傳輸效率,提高了用戶體驗(yàn)。
1.JavaScript的Eval()函數(shù)
在保障數(shù)據(jù)傳輸效率的同時(shí),安全性的保障也是我們目前面臨的重要問題,而JSON本來是JavaScript的一個(gè)安全的子集,不含有賦值和調(diào)用。因此在將JSON數(shù)據(jù)轉(zhuǎn)換成為JavaScript對(duì)象的時(shí)候,我們包括許多JavaScript庫都使用Eval函數(shù)。這意味著獲取的JSON數(shù)據(jù)將被解析并執(zhí)行,尤其是當(dāng)有些數(shù)據(jù)是來自用戶輸入的時(shí)候,可能會(huì)帶來意想不到的安全性問題。攻擊者可以利用這點(diǎn)發(fā)送畸形、惡意的JSON數(shù)據(jù),這樣Evial函數(shù)就會(huì)執(zhí)行這些惡意代碼。
如發(fā)送以下學(xué)生信息代碼:
上面的代碼會(huì)導(dǎo)致瀏覽器把用戶的Cookie數(shù)據(jù)提交到一個(gè)流氓網(wǎng)站,其中一種防止不安全代碼出現(xiàn)的解決辦法,是通過瀏覽器原生支持的JSON.parse(str)方法讀取JSON數(shù)據(jù),目前已經(jīng)得到大部分主流瀏覽器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),而在不支持原生JSON對(duì)象的瀏覽器上面可以使用parseJSON方法進(jìn)行讀取,parseJSON采用解析器驗(yàn)證讀入的代碼是否真的是JSON代碼,這樣就提供了較好的安全性,但由于這是用模擬的方式讀取,速度上會(huì)比Eval()慢。因此,在使用JSON作為數(shù)據(jù)交換格式的時(shí)候,我們可以使用正則表達(dá)式來檢查JSON數(shù)據(jù)是否包含有惡意代碼關(guān)鍵字,以此來保障JSON的安全性。
2.跨站訪問問題
JSON數(shù)據(jù)傳輸?shù)牧硗庖粋€(gè)安全性問題則是跨站請(qǐng)求偽造(Cross-site request forgery,簡稱CSRF或XSRF),增加了用戶數(shù)據(jù)傳輸?shù)陌踩噪[患。對(duì)于這個(gè)問題,由于 JavaScript采用了稱為“沙盒”的機(jī)制,這種機(jī)制限制JavaScript引擎僅能引入同一個(gè)站點(diǎn)的代碼,因而某種程度上提高了JSON的安全性,確保用戶數(shù)據(jù)安全傳輸而不會(huì)使數(shù)據(jù)泄漏。
JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規(guī)范的標(biāo)簽形式,很難分出勝負(fù)。XML和JSON都是使用結(jié)構(gòu)化方法來標(biāo)記數(shù)據(jù)的,而JSON也提供了一種具有嵌套數(shù)據(jù)元素的結(jié)構(gòu),就像XML一樣。與XML相同,JSON也是基于文本的,且它們都使用Unicode編碼,且其與XML一樣具有可讀性。
XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有,沒有什么是XML能擴(kuò)展,JSON不能的,不過JSON可以存儲(chǔ)復(fù)合對(duì)象,有著XML不可比擬的優(yōu)勢。從主觀上來看,JSON更為清晰且冗余更少,而且JSON網(wǎng)站提供了對(duì)JSON語法的嚴(yán)格描述,只是描述較簡短。從總體來看,XML比較適合于標(biāo)記文檔,而JSON卻更適于進(jìn)行數(shù)據(jù)交換處理,一個(gè)JSON文檔的每一個(gè)實(shí)例都負(fù)責(zé)描述一個(gè)對(duì)象,其具體的描述是通過使用嵌套的對(duì)象,數(shù)組,字符串,數(shù)字,布爾值或null值來實(shí)現(xiàn)的。
XML是一種用于描述信息存儲(chǔ)格式的語言,其優(yōu)點(diǎn)是健壯性和描述性強(qiáng),而且是新一代開放可互操作的Web Service選用的通信數(shù)據(jù)格式。在移動(dòng)應(yīng)用程序中,開放者通常自己創(chuàng)建數(shù)據(jù)交換格式或可擴(kuò)展標(biāo)記語言XML。前者的優(yōu)勢是可針對(duì)特殊定情況進(jìn)行調(diào)整,從而最大限度的提高性能,并最大限度的利用計(jì)算機(jī)資源。當(dāng)在HTTP上使用后者時(shí),其優(yōu)勢在于它是事實(shí)上的數(shù)據(jù)交換標(biāo)準(zhǔn)。另外,在XML中使用的基于文本的表示形式使其易于調(diào)試。這兩種放放風(fēng)各有其缺陷,前者本質(zhì)是專用的非標(biāo)準(zhǔn)的,并可能是不可互操作的,而后者數(shù)據(jù)表示過于正規(guī)和繁瑣,對(duì)于移動(dòng)和嵌入式應(yīng)用程序,JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,是基于文本的,具有良好的可讀性且易于調(diào)試,JSON支持所有基本數(shù)據(jù)類型的表示法,并提供將這些數(shù)據(jù)類型相互解析為Java類型的方法,對(duì)于輕量級(jí)應(yīng)用,JSON數(shù)據(jù)交換格式能夠較好的節(jié)省手機(jī)的計(jì)算資源,減少網(wǎng)絡(luò)傳輸時(shí)間,加快網(wǎng)絡(luò)傳輸速度。
XML有豐富的編碼工具,比如 Dom4j、JDOM等,JSON也有json.org提供的工具。但是JSON的編碼難度相對(duì)XML容易許多,即使不借助工具也能寫出JSON的代碼,可是要寫好XML就比較復(fù)雜,JSON可以將JavaScript對(duì)象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在函數(shù)之間輕松地傳遞這個(gè)字符串,或者在異步應(yīng)用程序中將字符串從Web客戶機(jī)傳遞給服務(wù)器端程序。
XML的解析要考慮子節(jié)點(diǎn)和父節(jié)點(diǎn),相對(duì)來說較復(fù)雜,而JSON的解析難度幾乎為零,這一點(diǎn)是XML無法比擬的。JSON和XML同樣擁有豐富的解析手段,XML解析方式有兩種:一是通過文檔模型解析,也就是通過父標(biāo)簽索引出一組標(biāo)記,但這樣必須在預(yù)先知道文檔結(jié)構(gòu)的情況下使用,無法進(jìn)行通用的封裝。另外一種方法是遍歷節(jié)點(diǎn),這個(gè)可以通過遞歸來實(shí)現(xiàn),不過解析出來的數(shù)據(jù)仍舊是形式各異,往往也不能滿足預(yù)先的要求。凡是這樣可擴(kuò)展的結(jié)構(gòu)數(shù)據(jù)解析起來一定都很困難,JSON也同樣如此,但如果預(yù)先知道JSON結(jié)構(gòu)的情況下,使用JSON進(jìn)行數(shù)據(jù)傳遞就更加方便快捷,可以寫出很實(shí)用美觀可讀性強(qiáng)的代碼。
JSON和JavaScript的交互更加方便,客戶端JavaScript可以簡單的通過evil()進(jìn)行JSON數(shù)據(jù)的讀取,但JSON對(duì)數(shù)據(jù)的描述性和XML相比較差。
XML已經(jīng)被業(yè)界廣泛的使用,而JSON才剛剛開始,只是在Ajax這個(gè)特定的領(lǐng)域。在普通的Web應(yīng)用領(lǐng)域,開發(fā)者經(jīng)常為XML的解析傷腦筋,無論是服務(wù)器端生成處理XML,還是客戶端用JavaScript解析XML,都常常導(dǎo)致復(fù)雜的代碼,極低的開發(fā)效率。
實(shí)際上,對(duì)于大多數(shù)Web應(yīng)用來說,它們根本不需要復(fù)雜的XML來傳輸數(shù)據(jù),XML宣稱的擴(kuò)展性在此就很少具有優(yōu)勢;許多Ajax應(yīng)用甚至直接返回HTML片段來構(gòu)建動(dòng)態(tài)Web頁面。和返回XML并解析它相比,返回HTML片段大大降低了系統(tǒng)的復(fù)雜性,但同時(shí)缺少了一定的靈活性。同XML或HTML片段相比,數(shù)據(jù)交換格式JSON提供了更好的簡單性和靈活性。
通過手機(jī)移動(dòng)終端來訪問Web服務(wù)器已成為眾多用戶的選擇,學(xué)生通過手機(jī)隨時(shí)隨地訪問教務(wù)系統(tǒng),在手機(jī)上和同學(xué)們進(jìn)行學(xué)習(xí)交流等已成為廣大高校學(xué)生的需求,但從另一方面來講,流量的大量消耗也成為了學(xué)生們的負(fù)擔(dān)。而JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,能夠生成更小的文檔,且其在JavaScript腳本中更易于使用。其基本思想是,把自己實(shí)現(xiàn)為JavaScript開發(fā)中XML數(shù)據(jù)操作的主要替代者,利用其簡單的數(shù)據(jù)格式,較小帶寬的占用,代碼開發(fā)量小,兼容性強(qiáng),解析速度快,開發(fā)效率高,靈敏度高等優(yōu)點(diǎn)有效地解決了XML所造成的缺陷,大大減小了移動(dòng)瀏覽時(shí)的網(wǎng)絡(luò)流量,在確保數(shù)據(jù)安全傳輸?shù)耐瑫r(shí)大大提高了數(shù)據(jù)傳輸效率,體現(xiàn)了其優(yōu)越性。
[1]欒詠紅.基于Android的X ML解析器的分析與比較[J].南京曉莊學(xué)院學(xué)報(bào),2011,(6):98-100.
[2]李瑞花.基于Android的XML解析技術(shù)的分析[J].計(jì)算機(jī)時(shí)代,2010,(12):31-33.
[3]劉平.Android手機(jī)訪問服務(wù)器的一種數(shù)據(jù)交互方法[H].電子設(shè)計(jì)工程,2010,18(9):96-98,102.
[4]王曉禹,石麗.基于JSON實(shí)現(xiàn)Android智能終端與Web服務(wù)器“面向?qū)ο蟆钡男畔⒔粨Q[J].數(shù)字技術(shù)與應(yīng)用,2012,(04):224-225.
[5]肖鄧華.基于Ajax和JSON的高校信息發(fā)布的系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].軟件開發(fā)與設(shè)計(jì),2010,(02):86.
[6]張濤,黃強(qiáng),毛磊雅等.一個(gè)基于JSON的對(duì)象序列化算法[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(15):98-100.
[7]胡文發(fā),白中英.基于 J2ME/J2EE的JSON數(shù)據(jù)交換的探討[J].電子設(shè)計(jì)工程,2009,17(12):102-103.
[8]崔璨,倪宏.使用 JSON對(duì)AJAX技術(shù)中的XML性能的優(yōu)化仿真[J].通信技術(shù),2009,42(08):102-110,114.
[9]高靜,段會(huì)川.基于移動(dòng)設(shè)備的JSON數(shù)據(jù)傳輸效率研究[J].信息技術(shù)與信息化,2011,(1):13-15.
[10]胡集儀.使用JSON改進(jìn)WEB數(shù)據(jù)傳輸[J].科技信息,2008,(35):90,97.