JSON和JSONP的區別

       JSON和JSONP的區別

       先前的概念中對JSON還是比較熟悉,對JSONP不是特別的清楚,整理完相關知識發現才豁然開朗。簡單的說JSON是一種數據交換格式,而JSONP是一種非官方跨域數據交互協議。JSON是“暗號”,而JSONP則是接頭方式。一個是描述信息的格式,一個是信息傳遞雙方約定的方法。

一、什麼是JSON

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成爲理想的數據交換語言。

JSON建構於兩種結構:

  • “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解爲對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。

  • 值的有序列表(An ordered list of values)。在大部分語言中,它被理解爲數組(array)。

這些都是常見的數據結構。事實上大部分現代計算機語言都以某種形式支持它們。這使得一種數據格式在同樣基於這些結構的編程語言之間交換成爲可能。

JSON具有以下這些形式:

對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

object.gif

數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。


array.gif

值(value)可以是雙引號括起來的字符串(string)、數值(number)、truefalsenull、對象(object)或者數組(array)。這些結構可以嵌套。

value.gif


字符串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。

字符串(string)與C或者Java的字符串非常相似。

string.gif

數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。

number

空白可以加入到任何符號之間。 以下描述了完整的語言。

JSON的優點:

  1. 基於純文本,跨平臺傳遞極其簡單;

  2. Javascript原生支持,後臺語言幾乎全部支持;

  3. 輕量級數據格式,佔用字符數量極少,特別適合互聯網傳遞;

  4. 可讀性較強,雖然比不上XML那麼一目瞭然,但在合理的依次縮進之後還是很容易識別的;

  5. 容易編寫和解析,當然前提是你要知道數據結構;


二、什麼是JSONP?

JSONPJSON with Padding)是資料格式 JSON 的一種“使用模式”,可以讓網頁從別的網域要資料。由於同源策略,一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com 的服務器溝通,而 HTML 的 <script> 元素是一個例外。利用<script> 元素的這個開放策略,網頁可以得到從其他來源動態產生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料並不是 JSON,而是任意的 JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。


ajax與jsonp的異同

  1. ajax和jsonp這兩種技術在調用方式上“看起來”很像,目的也一樣,都是請求一個url,然後把服務器返回的數據進行處理,因此jquery和ext等框架都把jsonp作爲ajax的一種形式進行了封裝;

  2. 但ajax和jsonp其實本質上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內容,而jsonp的核心則是動態添加<script>標籤來調用服務器提供的js腳本。

  3. 所以說,其實ajax與jsonp的區別不在於是否跨域,ajax通過服務端代理一樣可以實現跨域,jsonp本身也不排斥同域的數據的獲取。

  4. 還有就是,jsonp是一種方式或者說非強制性協議,如同ajax一樣,它也不一定非要用json格式來傳遞數據,如果你願意,字符串都行,只不過這樣不利於用jsonp提供公開服務。

總而言之,jsonp不是ajax的一個特例,哪怕jquery等巨頭把jsonp封裝進了ajax,也不能改變着一點!

參考文檔:

http://www.json.org/json-zh.html

http://zh.wikipedia.org/zh-cn/JSONP





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章