Ajax是“非同步javascript和XML”的縮寫已經眾所周知,然而雖然XML是看上去的重要組成部分,它卻不是必須的。一位資深的軟體工程師Douglas Crock ford 開發了一個內建於 javascript 的資料格式,稱為javascript 對象表示(JSON,javascript Object Notation),意思是直接使用Ajax對象來傳遞資訊,可以讀作“Jason”。
1. 什麼是 JSON
JSON概念很簡單,JSON 是一種輕量級的資料格式,他基於 javascript 文法的子集,即數組和對象表示。由於使用的是 javascript 文法,因此JSON 定義可以包含在javascript 檔案中,對其的訪問無需通過基於 XML 的語言來額外解析。不過在使用 JSON 之前,很重要的一點是理解 javascript 中數組及對象字面量的特殊文法。
1.1 數組字面量
數組字面量,是用一對方括弧括起一組用逗號隔開的 javascript 值,例如:
複製代碼 代碼如下:
var aNames=["hello", 12, true , null];
[html]
1.2 對象字面量
對象字面量,是通過兩個花括弧來定義的。在花括弧內可以放置任意數量的“名稱-值”對,定義格 式字串值”。除了最後一行外,每個“名稱-值”對後必須有一個逗號(這與Perl 中的聯合數組的定義有些類似)。例如:
[code]
var oCar = {
"color": "red",
"doors" : 4,
"paidFor" : true
};
1.3 混合字面量
我們可以混用對象和數組字面量,來建立一個對象數組,或一個包含數組的對象。例如:
複製代碼 代碼如下:
{comments:[
{
id:1,
author:"someone1",
url:"http://someone1.x2design.net",
content:"hello"
},
{
id:2,
author:"someone2",
url:"http://someone2.x2design.net",
content:"hello"
},
{
id:3,
author:"someone3",
url:"http://someone3.x2design.net",
content:"hello"
}
]};
1.4 JSON 文法
在Ajax應用中,就是伺服器直接產生javascript語句,用戶端擷取後直接用eval方法來獲得這個對象,這樣就可以省去解析XML的效能損失。同時,在javascript 通訊中使用JSON作為資料格式的好處很明星,可以立即獲得資料的值,因此可以更快的訪問其中包含的資料。
var oCarInfo = eval("(" + sJSON + ")");
請記住:在javascript中花括弧也是一個語句。要讓解析器知道這個花括弧表示的是一個對象而非一個語句的唯一方法是能否找到封裝它的圓括弧(它是用來說明代碼是一個運算式而非一個語句)。
1.5 JSON 編碼和解碼
作為 JSON 資源的一部分,Corockford 開發了一個能夠實現 JSON 和Javascript 對象直接解碼和編碼的工具。這個工具的來源程式可以在 www.crockford.com/JSON/json.js 中下載。
在上面提出用到eval() 存在些固有的不足:它是用來對傳入的任何 Javascript 代碼求值的,而不僅僅針對JSON。因此,當涉及企業級 web 應用程式開發時,它存在很大的安全隱患。為瞭解決這個問題,可以使用只用來將 JSON 代碼轉換為 Javascript 的解析器 JSON.parse() 方法來實現。例如:
var oObject = JSON.parse (sJSON);
同時,它也提供了一種將 Javascript 對象轉換為 JSON 字串(資料轉送時使用的)的工具(在Javascript 中沒有內建這種功能支援)。你要做的只是將對象傳入到 JSON.Stringify() 方法。請看下面的例子:
複製代碼 代碼如下:
var oCar = new Object();
oCar.doors = 4;
oCar.color = "blue";
oCar.year = 1995;
oCar.drivers = new Array("Penny", "Dan" , "Kris");
document.write(JSON.stringify(oCar));
這段代碼將輸出如下所示的JSON 字串:
{"doors" : 4, "color" : "blue", "year" :1995, "drivers" : ["Penny", "Dan" , "Kris"]}
2. JSON 與 XML
正如上面所說,JSON 與 XML 相比的一大優點就是它更加簡單。
請看 XML 資料表示執行個體:
使用XML表示:
複製代碼 代碼如下:
<comments>
<comment>
<id>1</id>
<author>someone1</author>
<url>http://someone1.x2design.net</url>
<content>hello</content>
</comment>
<comment>
<id>2</id>
<author>someone2</author>
<url>http://someone2.x2design.net</url>
<content>someone1</content>
</comment>
<comment>
<id>3</id>
<author>someone3</author>
<url>http://someone3.x2design.net</url>
<content>hello</content>
</comment>
</comments>
使用JSON表示:
複製代碼 代碼如下:
{comments:[
{
id:1,
author:"someone1",
url:"http://someone1.x2design.net",
content:"hello"
},
{
id:2,
author:"someone2",
url:"http://someone2.x2design.net",
content:"hello"
},
{
id:3,
author:"someone3",
url:"http://someone3.x2design.net",
content:"hello"
}
]};
很容易發現,許多冗餘的資訊不見了。由於不需要有與開始標籤(opening tag)匹配的結束標籤(closing tag),因此傳送相同的資訊所需的位元組數大大降低了。創始人 Corockford 將其稱之為“XML 的減肥方案”)。
JSON 格式的資料與 XML 相比,缺點是對於外行人可讀性更差。當然,有一種觀點是,資料交換格式不是用肉眼觀察的。如果是通過工具對來回傳送的資料進行建立和解析,那麼的確沒有理由要求資料必須使人們易於閱讀。問題的實質在於:存在可用的 JSON 工具。
3. 伺服器端 JSON 工具
java :java JSON 工具,由Douglas Crock ford 開發,可在 www.crockford.com/JSON/java/
中下載,它可以在 JSP 中使用。
4. JSON 優勢與缺點
JSON不僅減少瞭解析XML解析帶來的效能問題和相容性問題,而且對於javascript來說非常容易使用,可以方便的通過遍曆數組以及訪問對象屬性來擷取資料,其可讀性也不錯,基本具備了結構化資料的性質。不得不說是一個很好的辦法,而且事實上google maps就沒有採用XML傳遞資料,而是採用了JSON方案。
JSON 另外一個優勢是跨域可行性,例如你在www.xxx.com的網頁裡使用是完全可行的,這就意味著你可以跨域傳遞資訊。而使用XMLHttpRequest卻擷取不了跨域的資訊,這是javascript內部的安全性質所限制的。
JSON看上去很美,是不是就能完全取代XML呢?事實並非如此,而原因就在於XML的優勢:通用性。要使伺服器端產生文法合格的javascript代碼並不是很容易做到的,這主要發生在比較龐大的系統,伺服器端和用戶端有不同的開發人員。它們必須協商對象的格式,這很容易造成錯誤。
無論如何,JSON是一個誘人的技術,準備做一個大量的試用。希望屆時可以擷取大的效能提高。