1. 程式人生 > >JSON剖析:優點和不足

JSON剖析:優點和不足

摘要

  XML——這種用於表示客戶端與伺服器間資料交換有效負載的格式,幾乎已經成了Web services的同義詞。然而,由於AjaxREST技術的出現影響了應用程式架構,這迫使人們開始尋求`XML的替代品,如:JavaScript Object NotationJSON)。

  JSON 作為一種更輕、更友好的 Web services客戶端的格式(多采用瀏覽器的形式或訪問 REST風格 Web服務的Ajax應用程式的形式)引起了 Web 服務供應商的注意。

  本文將闡述JSONWeb services設計中備受推崇的原因,以及它作為XML替代方案的主要優勢和侷限性。文中還會深入探討:隨著相應的Web

服務客戶端選擇使用JSON,如何才能便捷地在Java Web services中生成JSON輸出。

XML的十字路口: 瀏覽器和 Ajax

  XML設計原理已經發布了將近十年。時至今日,這種標記語言已經在廣闊的軟體應用領域中佔據了主導地位。從Java.NET等主流平臺中的配置和部署描述符到應用整合場景中更復雜的應用,XML與生俱來的語言無關性使之在軟體架構師心目中佔據著獨特的地位。但即便最著名的XML權威也不得不承認:在某些環境中,XML的使用已經超出了它自身能力的極限。

  圍繞Ajax原理構建的那些Web應用程式最能說明XML的生存能力,從這一點來看,一種新的有效負載格式的發展壯大也得益於XML

。這種新的有效負載格式就是JavaScript Object Notation (JSON)。在探索這種新的標記語言的複雜性之前,首先來分析一下在這種獨特的設計形式中,XML具有哪些侷限性。

  Ajax建立了一個用於從遠端Web services傳送和接收資料的獨立通道,從而允許Web程式執行通道外(out-of-band)客戶端/伺服器呼叫。通俗地說,Ajax程式中的更新和導航序列在典型的客戶端/伺服器環境之外完成,在後臺(即通道外)接受到資訊後,必須進行一次完整的螢幕重新整理。更多背景資訊,請參閱David Teare Ajax簡介(Dev2Dev)。

  這些應用程式更新通常是通過REST

風格(RESTfulWeb services獲得的,一旦被使用者的瀏覽器接收到,就需要整合到HTML頁面的總體佈局之中,這正是XML發揮強大力量的場合。儘管近年來,指令碼語言支援和外掛支援已使大多數主流瀏覽器的功能得到了強化,但許多程式設計任務依然難於開展,其中之一就是操縱或處理文字,這通常是使用DOM實現的。

  採用DOM的複雜性源於其基於函式的根,這使得對資料樹的簡單修改或訪問都需要進行無數次方法呼叫。此外,眾所周知,DOM在各種瀏覽器中的實現細節不盡相同,這一過程將帶來極為複雜的程式設計模式,其跨瀏覽器相容性出現問題的可能性極大。接下來的問題顯而易見,那就是:如何使一種標記語言輕鬆整合到HTML頁面中以滿足Ajax的要求?

  問題的答案就是:利用所有主流瀏覽器中的一種通用元件——JavaScript引擎。XML需要使用DOM之類的機制來訪問資料並將資料整合到佈局之中,採用這種方法,我們不再使用像XML這樣的格式來交付Ajax更新,而是採用一種更為簡單直觀的方式,採用JavaScript引擎自然匹配的格式——也就是JSON

  既然已經明確了JSONXMLAjax之間的關係,下面將進一步探討JSON背後的技術細節。

JSON剖析:優點和不足

  對於JSON,首先要明白JSONXML一樣也是一種簡單文字格式。相對於XML,它更加易讀、更便於肉眼檢查。在語法的層面上,JSON與其他格式的區別是在於分隔資料的字元,JSON中的分隔符限於單引號、小括號、中括號、大括號、冒號和逗號。下圖是一個JSON有效負載:

{"addressbook": {"name": "Mary Lebow",

"address": {

"street": "

5 Main Street
"

"city": "San Diego, CA",

"zip": 91912,

},

"phoneNumbers": [

"619 332-3452",

"664 223-4667"

]

}

}

  將上面的JSON有效負載用XML改寫,如下:

<addressbook>

<name>Mary Lebow</name>

<address>

<street>

5 Main Street
</street>

<city zip="91912"> San Diego, CA </city>

<phoneNumbers>

<phone>619 332-3452</phone>

<phone>664 223-4667</phone>

</phoneNumbers>

</address>

</addressbook>

  是不是很相似?但它們並不相同。下面將詳細闡述採用JSON句法的優點和不足。

優點

  乍看上去,使用JSON的資料分隔符的優點可能並不那麼明顯,但存在一個根本性的緣由:它們簡化了資料訪問。使用這些資料分隔符時, JavaScript引擎對資料結構(如字串、陣列、物件)的內部表示恰好與這些符號相同。

  這將開創一條比DOM技術更為便捷的資料訪問途徑。下面列舉幾個JavaScript程式碼片段來說明這一過程,這些程式碼片段會訪問先前的JSON程式碼片段中的資訊:

•訪問JSON中的名稱: addressbook.name

•訪問JSON中的地址: addressbook.address.street

•訪問JSON中的電話號碼第一位:addressbook.address.phoneNumbers[0]

  如果您具備DOM程式設計經驗,就能很快地看出區別;新手可以參看 Document Object Model 的這一外部資源,這裡提供了關於資料導航的例項。

  JSON的另一個優點是它的非冗長性。在XML中,開啟和關閉標記是必需的,這樣才能滿足標記的依從性;而在JSON中,所有這些要求只需通過一個簡單的括號即可滿足。在包含有數以百計欄位的資料交換中,傳統的XML標記將會延長資料交換時間。目前還沒有正式的研究表明JSONXML有更高的線上傳輸效率;人們只是通過簡單的位元組數比較發現,對於等效的JSONXML有效負載,前者總是小於後者。至於它們之間的差距有多大,特別是在新的XML壓縮格式下它們的差距有多大,有待進一步的研究。

  此外,JSON受到了擅長不同程式語言的開發人員的青睞。這是因為無論在Haskell中或 Lisp中,還是在更為主流的C#PHP中,開發都可以方便地生成JSON(詳見 參考資料)。

不足

  和許多好東西都具有兩面性一樣,JSON的非冗長性也不例外,為此JSON丟失了XML具有的一些特性。名稱空間允許不同上下文中的相同的資訊段彼此混合,然而,顯然在JSON中已經找不到了名稱空間。JSONXML的另一個差別是屬性的差異,由於JSON採用冒號賦值,這將導致當XML轉化為JSON時,在識別符號(XML CDATA)與實際屬性值之間很難區分誰應該被當作文字考慮。

  另外,JSON片段的建立和驗證過程比一般的XML稍顯複雜。從這一點來看,XML在開發工具方面領先於JSON。儘管如此,為了消除您對這一領域可能存在的困惑,下節將介紹一些最為成熟的JSON開發

posted on 2009-07-28 11:48 肥仔 閱讀(902) 評論(0)  編輯 收藏 引用 所屬分類: Web-前臺