2010年11月16日 星期二

[轉載] JSON傳送與接收


原文

XML可用來表現階層性資料,然而建立與處理XML DOM較為複雜
在Web應用程式中,許多時候並不需要用到XML的複雜階層性
此時通常會採用JSON作為資料交換格式
而JSON也正成為Web應用程式中交換資料的主要選擇。

JSON全名JavaScript Object Notation,為彷造JavaScript的物件實字(Object literal)格式而來
你可以在 http://www.json.org/ 找到詳細的JSON格式說明
大致而言,與物件實字格式類似,主要注意的是JSON:
作為名稱的部份,必須用"雙引號包括
作為值的部份,若為字串,必須用"雙引號包括
不支援函式表示

舉個例子來說,下面是個物件實字:
var obj = {
    name : 'Justin',
    age : 35,
    childs : [ { name : 'hamimi', age : 3} , { name : 'another', age : 5}]
};

若使用JSON表示,則是如下:
var json = '{"name":"Justin","age":35,"childs":[{"name":"hamimi","age":3}, { "name" : "another", "age" : 5}]}';

若為排版會比較容易觀察:
{
    "name":"Justin",
    "age":35,
    "childs":[
        {
            "name" : "hamimi",
            "age" : 3
        },

       {
            "name" : "another",
            "age" : 5
        }

    ]
}

你可以傳送JSON字串給伺服端,要建立JSON字串很簡單
在Firefox 3.1、Internet Explorer 8以上,支援簡單的JSON處理程式庫
如果要從JavaScript建立JSON字串,只要使用JSON.stringify(),例如:
var obj = {
    name : 'Justin',
    age : 35,
    childs : [ { name : 'hamimi', age : 3}, { "name" : "another", "age" : 5} ]
};
var json = JSON.stringify(obj);

這樣就可以得到方才所示範的JSON字串,如果要用非同步物件傳送JSON
則可以如下:
var request = xhr();     // xhr() 會建立非同步物件
request.onreadystatechange = handleStateChange;  // handleStateChange 參考至函式
request.open('POST', url);
request.setRequestHeader('Content-Type', 'application/json');
request.send(json);

請求標頭'Content-Typ'建議設為'application/json'
當然,伺服端要能夠剖析JSON字串以取出資料,但無需親自撰寫
http://www.json.org/ 網站中提供許多語言實作的JSON剖析器協助剖析JSON取得結果

伺服端可以傳回JSON字串
可以使用eval()將JSON字串計值(evaluate)為JavaScript物件
例如:
var obj = eval(json);

然而eval()也會運算傳入的JavaScript程式碼,因此並不建議直接用eval()
如果只是要計值JSON為JavaScript物件,可以使用JSON.parse()。例如:
var obj = JSON.parse(json);

如果是Firefox 3.1、Internet Explorer 8以外沒有內建JSON支援的瀏覽器
可以在 http://www.json.org/ 下載 json2.js
將之包括在網頁中,即可獲得上述的相關JSON方法:
<script type="text/javascript" src="json2.js">
如果遇到瀏覽器已內建JSON支援,json2.js什麼都不作

沒有留言:

張貼留言