JSON

資工三甲 494511108 羅子豪 Andrew32434
資工三乙 495512642 蘇靖翔 xiang
資工二甲 49451117X 李鴻春
資工二甲 495511569 李哲宇 tzef

JSON(Javascript Object Notation)

是一種羽量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, Javascript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。

JSON概念很簡單,就是伺服器直接生成Javascript語句,用戶端獲取後直接用eval方法來獲得這個物件,這樣就可以省去解析XML的資源損失。

XML是種用於表示用戶端與伺服器間資料交換有效負載的格式,幾乎已經成了Web services的同義詞。我們知道AJAX技術能夠使得每一次請求更加迅捷,對於每一次請求返回的不是整個頁面,也僅僅是所需要返回的資料。然而,由於 Ajax技術的出現影響了應用程式架構,這迫使人們開始尋求`XML的替代品,如:JavaScript Object Notation(JSON)。

JSON 作為一種更輕、更友好的 Web services用戶端格式。通常AJAX通過返回XML格式的資料,然後再通過用戶端複雜的JavaScript腳本解析和渲染這些XML格式的資料。JSON 是為了能夠使得資料格式成為一種標準,更簡單的被JavaScript解析。

JSON的優點

  • 羽量級的資料交換格式
  • 人們讀寫更加容易
  • 易於機器的解析和生成
  • 能夠通過JavaScript中eval()函數解析JSON
  • JSON支援多語言。包括:ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.

JSON語法是一種用於傳輸和生成資料的協定,很類似於C家族的語言,所以很容易被C家族的語言所解析。

對象:物件包含再{}之間 屬性:採用Key-Value對來表示。屬性之間使用逗號分開。 string : value 陣列:陣列存放再[]之間 [ elements ] 元素:元素之間用逗號分開 值:值可以是字串,數位,物件,陣列,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 的作用是格式化資料內容。現在來看看用JSON和XML處理JavaScript的差別。 JavaScript的指令碼語言自身有動態執行的能力。意思是我們可以把想要執行的語句放在字串裡,通過eval()這個動態執行函數來執行。字串裡的內容就會像我們所寫的一樣被執行。

<HTML>
<HEAD>
 <TITLE>eval example 1</TITLE>
</HEAD>
<BODY>
 <script>
  str = "alert('hello')";
  eval(str);
 </script>
</BODY>
</HTML>

但如果非同步傳來的是JavaScript的聲明語句,那豈不是用一條eval方法就能搞定解析了?比起解析複雜的XML,這樣的效率將提高許多!假設要載入一些通訊錄的資訊,如果寫成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>

打開頁面會彈出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>

但如果非同步傳來的是JavaScript的聲明語句,那豈不是用一條eval方法就能搞定解析了?比起解析複雜的XML,這樣的效率將提高許多!假設要載入一些通訊錄的資訊,如果寫成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:JavaScript Object Notation。 [
{
 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"
}
]

變簡單的不只是在表達上,最重要的是可以丟棄讓人暈頭轉向的DOM解析了。因為只要符合JavaScript的聲明規範,JavaScrip就會自動幫忙解析。

前文提到過,JSON的誕生和Ajax的興起有莫大關係,現在來探討一下XML發生了什麼事Ajax中使用JSON的基本方法是前臺載入後臺聲明JavaScript物件的字串,用eval方法來將它轉為實際的物件,最後通過 DHTML更新頁面資訊,而XML設計原理已經發佈了將近十年。時至今日,這種標記語言已經在廣闊的軟體應用領域中佔據了主導地位。從Java、.NET等主流平臺中的配置和部署描述符到應用集成場景中更複雜的應用,XML與生俱來的語言無關性使之在軟體架構師心目中佔據著獨特的地位。很多著名的XML權威也不得不承認:在某些環境中,XML的使用已經超出了它自身能力的極限。

圍繞Ajax原理構建的那些Web應用程式最能說明XML的生存能力,得益於XML,一種新的有效負載格式JavaScript Object Notation (JSON)開始發展壯大。

首先來分析一下在這種獨特的設計形式中,XML具有哪些局限性。
Ajax建立了一個用於從遠端Web services發送和接收資料的獨立通道,從而允許Web程式執行通道外(out-of-band)用戶端/伺服器調用。通俗地說,Ajax程式中的更新和導航序列在典型的用戶端/伺服器環境之外完成,在後臺(即通道外)接受到資訊後,必須進行一次完整的螢幕刷新。
許多程式設計任務操縱或處理文本通常是使用DOM實現的。

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

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

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

JSON剖析:優點和不足
  對於JSON,首先要明白JSON和XML一樣也是一種簡單文本格式。相對於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的資料分隔符號的優點可能並不那麼明顯,但存在一個根本性的緣由:它們簡化了資料訪問。使用這些資料分隔符號時, JavaScript引擎對資料結構(如字串、陣列、物件)的內部表示恰好與這些符號相同。
  這代表即將開創出一條比DOM技術更為便捷的資料訪問途徑。下面列舉幾個JavaScript代碼片段來說明這一過程,這些代碼片段會訪問先前的JSON代碼片段中的資訊:
訪問JSON中的名稱: addressbook.name
訪問JSON中的位址: addressbook.address.street
訪問JSON中的電話號碼第一位:addressbook.address.phoneNumbers[0]
  JSON的另一個優點是它的非冗長性。在XML中,打開和關閉標記是必需的,這樣才能滿足標記的依從性;而在JSON中,所有這些要求只需通過一個簡單的括弧即可滿足。在包含有數以百計欄位的資料交換中,傳統的XML標記將會延長資料交換時間。目前還沒有正式的研究表明JSON比XML有更高的線上傳輸效率;人們只是通過簡單的位元組數比較發現,對於等效的JSON和XML有效負載,前者總是小於後者。至於它們之間的差距有多大,特別是在新的XML壓縮格式下它們的差距有多大,有待進一步的研究。
  此外,JSON受到了擅長不同程式設計語言的開發人員的青睞。這是因為無論在Haskell中或 Lisp中,還是在更為主流的C#和PHP中,開發都可以方便地生成JSON
  和許多好東西都具有兩面性一樣,JSON的非冗長性也不例外,為此JSON丟失了XML具有的一些特性。命名空間允許不同上下文中的相同的資訊段彼此混合,然而,顯然在JSON中已經找不到命名空間。JSON與XML的另一個差別是屬性的差異,由於JSON採用冒號來賦與值,這將導致當XML轉化為JSON時,在識別字(XML CDATA)與實際屬性值之間很難區分誰應該被當作文本考慮。
  另外,JSON片段的創建和驗證過程比一般的XML稍顯複雜。從這一點來看,XML在開發工具方面領先於JSON。

JSON在任何情況都適合嗎
就像在軟體設計中程式設計語言的選擇一樣,JSON的選擇與否取決於自身的需求。如果Web services使用者將在傳統、功能完備的程式設計環境(如Java、.NET、PHP、Ruby等)中創建,那麼完全可以不使用JSON。給定大多數程式設計語言環境的無限制能力可提供完整的配置控制權(更不必說對定制庫、分析器或helper類的訪問),那麼JSON與XML及其他Web services有效載荷之間的差別可以忽略不計。

  反之,如果Web services使用者被限制在流覽器環境之外,那麼JSON是值得認真考慮的物件。在瀏覽器中使用Web services時當然希望在需要一個載入資料時是不會出現延遲/刷新的“漂亮的Web 2.0介面”,此時就不得不在流覽器中嵌入Ajax和Web services技術。

  在這種情況下,不僅受限於通過網路訪問處理環境,而且還會受到隨機用戶的限制,迫使經驗豐富的開發人員用最普遍的工具在瀏覽器中處理文本,例如:前述的DOM,而與訪問JSON相比,DOM使用起來非常困難。

結束語
儘管 “Ajax”中的“x”代表XML,Web services也通過堅持使用XML格式而成為主流,但這並不意味著這種方式無懈可擊。在文本處理方面,XML在Ajax程式的應用中已經暴露出一些缺點。在這種情形下,JSON逐漸成為引人注目的XML替代方案。

  通過對JSON語法優缺點的論述,以及對如何Web services創建JSON輸出、如何將其嵌入Web頁面配置等問題的介紹,現在JSON能完全取代XML嗎?目前的狀況還不能夠,原因就在於XML的優勢:通用性。要使伺服器端產生語法合格的Javascript代碼並不是很容易做到的,這主要發生在比較龐大的系統,伺服器端和用戶端有不同的開發人員。它們必須協商物件的格式,這很容易造成錯誤。