Ajax和WEB服務數據格式:JSON與JSONP

作者: rockux  發布時間: 2011-04-17 18:23  閱讀: 5011 次  推薦: 1   原文鏈接   [收藏]  

  在之前的文章中我們講到了早期的集中數據格式,XML,SOAP,HTML。現在,我們來看看JSON和JSONP。

  JSON

  JSON(JavaScript Object Notation)是Douglas Crockford提出的。他是一個輕量級的數據交換格式,基于JavaScript對象字面量。

  我們可以將之前的XML圖書格式的文件內容轉換成下面的JSON格式:

 
[
{
title:
"The Principles of Beautiful Web Design, 2nd Edition",
url:
"http://www.sitepoint.com/books/design2/",
author:
"Jason Beaird",
publisher:
"SitePoint",
price: {
currency:
"USD",
amount:
39.95
}
},
{
title:
"jQuery: Novice to Ninja",
url:
"http://www.sitepoint.com/books/jquery1/",
author:
"JEarle Castledine & Craig Sharkie",
publisher:
"SitePoint",
price: {
currency:
"USD",
amount:
29.95
}
},
{
title:
"Build Your Own Database Driven Website",
url:
"http://www.sitepoint.com/books/phpmysql4/",
author:
"Kevin Yank",
publisher:
"SitePoint",
price: {
currency:
"USD",
amount:
39.95
}
}
]

  這是一個通過對象來表示書的一種方式,并且有title、url、author、publisher、和price等信息。price是一個子對象,并且他包含貨幣類型和價格。

  在JavaScript中很容易處理JSON。你可以使用瀏覽器原生的JSON.parse方法或者Douglas Crockford的JSON-js庫。就算這些都不能用,你也可以使用javaScript的eval方法。不需要再寫額外的處理數據的方法:

 
var json = xhr.responseText;
var book = JSON.parse(json);
alert(book[
0].title); //first book title
alert(book[1].url); //second book URL

  使用JSON的優點在于:

  • 比XML輕了很多,沒有那么多冗余的東西。
  • JSON也是具有很好的可讀性的,但是通常返回的都是壓縮過后的。不像XML這樣的瀏覽器可以直接顯示,瀏覽器對于JSON的格式化的顯示就需要借助一些插件了。
  • 在JavaScript中處理JSON很簡單。
  • 其他語言例如PHP對于JSON的支持也不錯。

  JSON也有一些劣勢:

  • JSON在服務端語言的支持不像XML那么廣泛,不過JSON.org上提供很多語言的庫。
  • 如果你使用eval()來解析的話,會容易出現安全問題。

  盡管如此,JSON的優點還是很明顯的。他是Ajax數據交互的很理想的數據格式。

  JSONP (JSON-p)

  如果你使用XMLHttpRequest來調用JSON的web服務,返回的數據可以通過JSON.parse()或者eval()來處理。你也可以使用Ajax組件來做腳本的插入,例如,將遠程加載的腳本插入在DOM節點中,通過script標簽調用:

 
var script = document.createElement("script");
script.src
= "http://webservice.com/?a=1&b=2";
document.getElementsByTagName(
"head")[0].appendChild(script);

  跟XMLHttpRequest不同,插入script標簽可以在不同源的情況下獲取其他服務的數據。這對于流量分析、書簽工具、小插件、廣告系統來說是很理想的選擇。

  不過,返回的JSON數據通常都是當做本地的代碼立即執行。也不會賦值給變量,所以后面就再訪問不到了。不過這個問題我們可以通過給網絡服務傳遞一個callback參數來進行回調:

 
var script = document.createElement("script");
script.src
= "http://webservice.com/?a=1&b=2&callback=MyDataHandler";
document.getElementsByTagName(
"head")[0].appendChild(script);

  這時候,網絡服務通常會返回一個包含在一個回調函數中的JSON數據,這就是JSONP,或者“JSON with padding”,看看代碼:

 
MyDataHandler([
{
title:
"The Principles of Beautiful Web Design, 2nd Edition",
url:
"http://www.sitepoint.com/books/design2/",
author:
"Jason Beaird",
publisher:
"SitePoint",
price: {
currency:
"USD",
amount:
39.95
}
}
...
]);

  在JSON對象下載完畢之后,作為參數傳遞給了MyDataHandler()方法。

  JSON和JSONP已經是現在最流行的異步交互的數據格式了。但是在壓縮傳輸數據大小的方面還是可以再研究的。RockUX會在后面講到關于自定義數據返回。

1
0
 
標簽:JavaScript Ajax
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()