【第155期 August 5, 2010】
 

研發新視界

初探JSON(JavaScript Object Notation)

作者/郭凱文

[發表日期:2010/8/5]




前言

XML「可擴展標示語言」(eXtensible Markup Language)的發展,是因應在Web環境下不同平台、格式的數據資料進行收集、轉換而設計的,同時也能在Web以外的環境中使用,包括了商業、出版業及企業內部資料交換應用,為了能在不同的環境中使用,XML被設計成使用上具有彈性與開放的語言,用自我描述方式定義了數據結構,讓不同的使用者製作不同XML文件;不過XML因為格式定義完整,文件內容較為龐大,佔用資源較多,在Server與Client端接需花費資源來解析XML數據,另外也牽扯出瀏覽器相容的問題。

JSON簡介

JSON(JavaScript Object Notation) 屬於一種輕量級的數據交換格式,是獨立於語言的文字格式,在設計上利於使用者閱讀與編寫,同時也易於機器解析與生成。JSON基於JavaScript Programming Language的標準,並且已成為 IETF RFC4627 的規範內容,採用完全獨立於語言的文字格式,這些特性促使JSON成為另一種理想的數據交換格式。

JSON用於描述文字(數據)結構,有以下兩種基本形式存在:

一、名稱/值對(collection):

名稱和值之間使用「:」隔開,每個名稱/值對之間使用「,」分割,並且使用「{」「}」括起來;一般的形式是:{name:value},如《圖一》。這樣的數據描述在不同的語言中會被解釋成不同的形式,可能是物件(Object)、結構體(Struct)、雜湊表 (Hash Table)或是關聯陣列(Associative Array)等。


《圖一》


二、值的有序列表(Array):

一個或多個值用「,」分割後,使用「[」,「]」括起來形成了列表,形如:[collection, collection],在很多語言中它被解釋為陣列,如《圖二》。


《圖二》


JSON與XML之比較

單純就資料交換、傳輸的格式而言,JSON是除了XML之外的另一種選擇,因為兩者儲存/封裝的都只是資料和結構,並不包含操作方法(method),JSON和XML的特性差異如下:

1. 描述相同資訊內容情況下,JSON所需儲存容量比XML小,因為它省去XML所需的標籤,加快了資料的傳輸。

2. JSON本身是JavaScript的子集所以可以用JavaScript的eval函數來剖析JSON結構,比起剖析XML結構的難易度,JSON相對較快也較容易

3. JSON與XML最大的不同在於XML是一個完整的標記(Markup)語言,造成XML在程式判讀上耗費比較多資源。主要的原因在於XML的設計理念與JSON不同,XML利用標記語言的特性提供了絕佳的延展性,而JSON則著重於資料數據的交換上,加上XML剖析需考慮到瀏覽器版本的問題,而JSON則是完全不用顧慮瀏覽器版本的問題;

4. JSON較為人垢病的是安全性問題,因為使用eval函數來剖析JSON結構容易造成電腦執行惡意程式碼的問題,所以JSON官方網站也提供了一套解決的方法使用,以JSON.parse函數取代eval函數來改善安全性上的疑慮。

JSON支援的資料型態包括了字串(String)、數字(Number)、陣列(Array)、布林(Boolean)、物件(Object)、空值(Null)六種,如《圖三》。


《圖三》


JSON的資料結構還可以進行嵌套,如下範例所示,一個object1可以有三個成員變數(包含string、number),而另一個array1則有5個number成員。



JSON支援的語系包括中文(Chinese)、英文(English)、法文(French)、德文(German)、義大利文(Italian)、日文(Japanese)、韓文(Korean)、西班牙文(Spanish)八國語文,支援的程式語言高達二十二種。

JSON實際操作與範例

基本上JSON並不是很難理解的資料結構,只要熟悉JavaScript,就很容易理解JSON的表示式,以下面JavaScript範例程式碼為例,利用傳統Javascript語法建立一個新物件(myBooks):



如果改為以Json語法表示



可以看到,JSON相較於Javascript,少了變數宣告的語法,只留下右邊的資料內容,即可儲存相同的資料內容。

如果要在程式中取用JSON格式的資料一樣十分的簡便,因為JSON屬於JavaScript的子集,所以可以在JavaScript中以eval()函式(javascript透過eval()使用文字解析器)讀入。不過這並不代表JSON無法使用於其他語言,目前幾乎所有與網頁開發相關的語言都有JSON函式庫。

以下是一JSON格式的字串



以往使用Javascript實作AJAX時,通常利用Javascript回傳Request內容給伺服器處理,伺服器再回傳處理後的XML格式資料,Javascript再利用DOM模型來解析回傳的XML資料,如下圖範例:



而使用JSON只要利用Javascript提供的 eval() 將JSON字串轉成物件即可,相當簡單且直覺;不過在字串的前後必須加上刮號 (),用來告知 Javascript Interpreter 這是個物件描述,而不是要執行的statement語法,即可將JSON格式的資料內容轉成變數。



但是程式直接呼叫 eval() 是比較危險的,因為程式會執行任何字串中包含的Javascript 程式碼,容易有 XSS 攻擊的危險,所以一般都建議引用官網上所提供的parser函數(http://www.json.org/json.js),來解析JSON格式的資料內容,如下範例。

直接使用eval函數解析JSON格式資料。



使用parser函數解析JSON資料,



結論

XML則提供較完整且可擴充性的交換格式,而JSON在使用上提供了更直覺的操作方法,程式的解析與儲存效能也較使用XML佳,額外的好處還有能夠突破XmlHttpRequest同一網域的限制,達到跨網域的要求,程式開發人員可以依據專案的需求,選擇合適的資料表達格式作為開發工具。

現行有許多Web2.0的應用程式和網路公司像是Yahoo、Google都已採用JSON作為資料交換格式,而愈來愈多的網路服務供應商在提供XML APIs之外,也開始提供JSON APIs,讓JSON成為另一種使用廣泛的中介資料交換格式。

參考資料

http://www.json.org/json-zh.html

http://zh.wikipedia.org/zh-tw/JSON

http://ajaxian.com/by/topic/json