[IE8修練大會] IE8與AJAX (I): 原生的JSON支援,解析資料更快更安全

  • 22236
  • 0

IE8對於網頁開發人員而言一個很大的改變是AJAX上的技術改進。我希望能夠分兩三篇文章來分別介紹IE8在AJAX上面所做的一些改進,而這次的文章是有關於IE8開始原生支援的JSON(JavaScript Object Notation)資料處理。包含一些簡單的程式碼範例和Demo。

IE8對於網頁開發人員而言一個很大的改變是AJAX上的技術改進。雖然微軟在JavaScript的速度「軍備競賽」上遠遠落後了對手,但是在AJAX的核心技術上,仍然做了很多安全層面上的努力。我希望能夠分兩三篇文章來分別介紹IE8在AJAX上面所做的一些改進。

而這次希望跟大家分享的是有關於IE8開始原生支援的JSON資料處理。

 

JSON是什麼?

JSON是JavaScript Object Notation(JavaScript物件表示法)的縮寫。簡單來說,就是用JavaScript表達陣列或物件的語法,做為傳遞物件訊息的語法。而由於這樣的語法也應該能夠輕易地被JavaScript所處理,JSON可以方便且快速地使用字串傳遞物件資料

JSON只使用幾種JavaScript的型態來進行表記:Number、Boolean、String、Object、Array和null。講這麼多不如來舉個例子好了。以下是一個合理的JSON字串:

{
  "users":
  [
    {
    "name": "littlebtc",
    "posts": 203,
    "admin": true,
    "intro": null
    }
,
    {
    "name": "doggy",
    "posts": 2,
    "admin": false,
    "intro": "I am a cute dog!"
    }

  ]
}

如 果你有過JavaScript的基礎,應該可以馬上看到JSON中物件({}括起來的)以及陣列([]括起來的)上的語法以及其他型態的語法上是和 JavaScript相同的。但要注意的是在JSON中,字串只允許用雙引號括起,而定義物件中的元素名稱時,其名稱也要使用雙引號標示。這樣的限制讓語 法變得比較一致 :)

 

不安全的JSON使用法

假如我把以上的JSON字串存在一個叫做json_text的變數中,而我想要讀取其中的內容,該怎麼辦呢?也許你會想到要用JavaScript的eval()(MSDN/MDC):

var myObject = eval("(" + json_text + ")");

// 這樣一來, myObject.users[1].name 就是 "doggy"(看一下前面的JSON吧)!

這樣子做是可行的,但是問題是這樣的語法極度不安全。原因在於eval()會乖乖執行那個字串字串裏頭的所有程式碼,如果對方使用奇怪的語法來攻擊網站(像是用document.write幫網頁加料),使用eval()會變得非常難以防禦

 

原生的JSON支援

這時來切入正題--有關IE8對JSON的支援。

由於JSON在使用eval()下可能會發生若干的問題,在ECMAScript 3.1正在修訂的草案中,有關解析/編碼JSON的標準原生函數被提了出來,所以應該會成為標準。主要而言有兩個:

  • JSON.parse()→安全地將JSON字串轉為物件
  • JSON.stringify()→安全地將物件轉為JSON字串

請容許我跳過複雜一點的例子和toJSON()的介紹,來看非常簡單的原生JSON處理。一樣,json_string是指剛剛最上面的JSON語法舉例:

// JSON -> Object
var myObject = JSON.parse(json_text);
alert(myObject.users[0].name); // littlebtc

// Objecy -> JSON
var myString = JSON.stringify(myObject);
alert(myString); // {"users":[{"name":"littlebtc","posts":203,"admin":true,"intro":null},{"name":"doggy","posts":2,"admin":false,"intro":"I am a cute dog!"}]}

可以看得出來,在使用了原生的JSON支援之後,不但可以高枕無憂地接收AJAX下傳來的JSON訊息,還可以輕鬆地用一行程式碼,把物件轉換成為一個JSON字串!跟使用XML比起來,JSON這樣實在是十分地有吸引力!(不過事實上XML也不甘示弱,他們也有E4X XD)

頭大時間:瀏覽器支援

又回到了頭大的時間:瀏覽器支援問題。這樣使用JSON看起來很美好,可是來看看瀏覽器的支援度吧:

等等,沒了?沒錯,沒了。 XD 其他瀏覽器都還沒有開始打算要動這一塊的樣子。

那該怎麼辦呢?過去在沒有JSON原生支援的時代,有一個廣為被使用的編解碼JSON腳本,也就是json.org的json2.js(捲到最下面有原始碼)。而更讓人雀躍的是,json2.js已經將語法修正為和ECMAScript提議中的新標準一致的新語法了。所以,我們可以使用json2.js和原生JSON相配合的方法來達到最大的瀏覽器支援:

<script type="text/javascript" src="json2.js"></script>

 

又到了Demo時間

這次的DEMO在這裡。只有一個按鈕 XD。

我利用了中文維基百科的MediaWiki API,以JSON形式抽出了500筆最近更改的資料,透過非AJAX直接用字串硬寫的超笨方式來示範JSON。按下按鈕時,會先處理JSON字串成為物件,然後秀出一個隨機挑選的條目名稱。

有興趣的話可以看一看Source Code喔 ;)

 

參考資料