JSON & JSONP 簡介
最近在學習Jquery,就常看到JSON及JSONP,只知道他是資料的集合,其它都不太瞭解,所以上網搜尋了一下,整了名詞解釋,希望能更瞭解一點。
JSON(Javascript Object Notation)
JSON(Javascript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。他本來就算在javascript標準裡,JSON是獨立於語言的文字格式,並且採用了類似於C語言家族的一些習慣。JSON格式是1999年《JavaScript
Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()
函式(javascript通過eval()調用解釋器)讀入。不過這並不代表JSON無法使用於其他語言,目前幾乎所有與網頁開發相關的語言都有JSON函式庫。
JSON,是一種描述javascript裡物件還有陣列(js的陣列其實也是物件啦)的一種簡略表示方法,用於描述數據結構,其結構有名稱/值 及陣列,像是下面這個範例就是JSON格式:
//Javascript
var test={
"x":1,
"y":2,
"str":"test",
"a":[
"array value 1",
"array value 2",
3
],
obj_array:[{
xx:0,
xxx:2
},{
xx:3,
xxx:5
}
]
};
由於JSON在語法上是JavaScript的子集合,所以一般都會使用eval()
作為讀取資料的方式,這在JSON資料提供站台與使用站台都屬於可信賴時並不會有問題。但如果資料提供站台不在信任範圍內,將JavaScript程式碼嵌入JSON,則會造成安全上的問題。
另外一個安全上的問題則是跨站存取(Cross-site request
forgery,簡稱CSRF或XSRF)。這個問題在Javascript中的狀況是,由於Javascript採用了稱為「沙盒」的機制,這種機制限制Javascript引擎僅能引入同一個站點的代碼,因而某種程度上提高了安全性。
官方網站:http://www.json.org
JSONP(JSON with Padding)
什麼是JSONP:JSONP(JSON with Padding)是一個非官方的協議,它允許在服務器端集成Script
tags返回至客戶端,通過javascript
callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。由於 JSON 只是一種含有簡單括號結構的純文本,因此許多通道都可以交換 JSON
消息。因為同源策略的限制(上述提到的安全性問題),我們不能在與外部服務器進行通信的時候使用
XMLHttpRequest。而JSONP是一種可以繞過同源策略的方法,即通過使用 JSON 與 <script>
標記相結合的方法,從服務端直接返回可執行的JavaScript函數調用或者
JavaScript對象。
JSONP的原理很簡單,但需要服務器端給予相應配合。大致來說,JSONP的實現思路就是在客戶端編程時作好使用JSON數據的準備,然後再通過圓括號將這些數據括起來以創建一條有效的JavaScript語句(可能是一次有效的函數調用)。
也就是說,客戶端可以使用一個用於命名jsonp的查詢參數來決定可以獲取的數據。最簡單的情況下,如果jsonp參數為空,則返回的數據就是被括在圓括號中的JSON。
目前已經有很多open的framework 有採用JSONP:dojo、JQuery、Youtube
GData API 、Google Social Graph API 、Digg API 、GeoNames webservice、豆瓣API、Del.icio.us JSON API等
JSONP只是解決了標準化的問題,但假如遠程主機想通過script標籤向頁面中注入惡意代碼,而不是返回JSON數據,那麼網站還是可能會隨時受到威脅。不過,一旦實現了JSONP,那麼對開發人員來說肯定是一件省時省力的大好事,在此基礎上各種一般化的抽像、教程及文檔也會應運而生的。 我們可以使用若干種方法在 JavaScript 程序中動態地生成代碼。因此在要進行eval()前,可以利用下面的正則表達式檢查 JSON 字符串看是不是有危安成份:
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, '' ''))) &&
eval(''('' + text + '')'');
參考資料:
http://diary.tw/tim/22
http://zh.wikipedia.org/wiki/JSON#.E8.B7.A8.E7.AB.99.E5.AD.98.E5.8F.96.E5.95.8F.E9.A1.8C
http://www.cn-cuckoo.com/2008/09/13/the-origin-of-jsonp-262.html
http://www.matrix.org.cn/resource/article/2008-03-06/b2e0ea4e-eb69-11dc-91da-b599c3ba16ef.html
近期留言