JSON與JSONP

說到AJAX就會(huì)不可避免的面臨兩個(gè)問題,第一個(gè)是AJAX以何種格式來交換數(shù)據(jù)?第二個(gè)是跨域的需求如何解決?這兩個(gè)問題目前都有不同的解決方案,比如數(shù)據(jù)可以用自定義字符串或者用XML來描述,跨域可以通過服務(wù)器端代理來解決。

但到目前為止最被推崇或者說首選的方案還是用JSON來傳數(shù)據(jù),靠JSONP來跨域。而這就是本文將要講述的內(nèi)容。

什么是JSON?


前面簡(jiǎn)單說了一下,JSON是一種基于文本的數(shù)據(jù)交換方式,或者叫做數(shù)據(jù)描述格式,你是否該選用他首先肯定要關(guān)注它所擁有的優(yōu)點(diǎn)。

**JSON的優(yōu)點(diǎn):**

1、基于純文本,跨平臺(tái)傳遞極其簡(jiǎn)單;

2、Javascript原生支持,后臺(tái)語言幾乎全部支持;

3、輕量級(jí)數(shù)據(jù)格式,占用字符數(shù)量極少,特別適合互聯(lián)網(wǎng)傳遞;

4、可讀性較強(qiáng),雖然比不上XML那么一目了然,但在合理的依次縮進(jìn)之后還是很容易識(shí)別的;

5、容易編寫和解析,當(dāng)然前提是你要知道數(shù)據(jù)結(jié)構(gòu);

JSON的缺點(diǎn)當(dāng)然也有,但在作者看來實(shí)在是無關(guān)緊要的東西,所以不再單獨(dú)說明。

**JSON的格式或者叫規(guī)則:**

JSON能夠以非常簡(jiǎn)單的方式來描述數(shù)據(jù)結(jié)構(gòu),XML能做的它都能做,因此在跨平臺(tái)方面兩者完全不分伯仲。

1、JSON只有兩種數(shù)據(jù)類型描述符,大括號(hào){}和方括號(hào)[],其余英文冒號(hào):是映射符,英文逗號(hào),是分隔符,英文雙引號(hào)""是定義符。

2、大括號(hào){}用來描述一組“不同類型的無序鍵值對(duì)集合”(每個(gè)鍵值對(duì)可以理解為OOP的屬性描述),方括號(hào)[]用來描述一組“相同類型的有序數(shù)據(jù)集合”(可對(duì)應(yīng)OOP的數(shù)組)。

3、上述兩種集合中若有多個(gè)子項(xiàng),則通過英文逗號(hào),進(jìn)行分隔。

4、鍵值對(duì)以英文冒號(hào):進(jìn)行分隔,并且建議鍵名都加上英文雙引號(hào)"",以便于不同語言的解析。

5、JSON內(nèi)部常用數(shù)據(jù)類型無非就是字符串、數(shù)字、布爾、日期、null 這么幾個(gè),字符串必須用雙引號(hào)引起來,其余的都不用,日期類型比較特殊,這里就不展開講述了,只是建議如果客戶端沒有按日期排序功能需求的話,那么把日期時(shí)間直接作為字符串傳遞就好,可以省去很多麻煩。

什么是JSONP?


? ? ? ? JSONP(JSON with Padding)是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題。由于同源策略,一般來說位于 server1.example.com 的網(wǎng)頁無法與不是 server1 .example .com的服務(wù)器溝通,而 HTML 的script元素是一個(gè)例外。利用scrip元素的這個(gè)開放策略,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執(zhí)行而不是用 JSON 解析器解析。

其實(shí)我對(duì)于JSONP的理解還很膚淺,大概知道這是一個(gè)什么概念而已。別人怎么說都聽不懂,我的理解,JSONP就是用< scrip 去引入一個(gè)遠(yuǎn)端的PHP文件,然后PHP返回的值封裝成< scrip來應(yīng)付瀏覽器,成功繞過瀏覽器禁止跨域的數(shù)據(jù)訪問的條文。雖然路已經(jīng)通常了,但是本端和遠(yuǎn)端文件還存在相互不認(rèn)識(shí)的問題,所以最簡(jiǎn)單的方式是在本端引入PHP文件之前定義一些函數(shù),這些函數(shù)就是專門給遠(yuǎn)端PHP用的,敲門磚而已。例如:alert('我是本地函數(shù),可以被跨域的remote.js文件調(diào)用,遠(yuǎn)程js帶來的數(shù)據(jù)是:'+data.result);調(diào)用者可以傳一個(gè)參數(shù)過去告訴服務(wù)端“我想要一段調(diào)用XXX函數(shù)的js代碼,請(qǐng)你返回給我”,于是服務(wù)器就可以按照客戶端的需求來生成js腳本并響應(yīng)了。

Ajax和JSONP對(duì)比:


1、ajax和jsonp這兩種技術(shù)在調(diào)用方式上“看起來”很像,目的也一樣,都是請(qǐng)求一個(gè)url,然后把服務(wù)器返回的數(shù)據(jù)進(jìn)行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進(jìn)行了封裝;

2、但ajax和jsonp其實(shí)本質(zhì)上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內(nèi)容,而jsonp的核心則是動(dòng)態(tài)添加標(biāo)簽來調(diào)用服務(wù)器提供的js腳本。

3、所以說,其實(shí)ajax與jsonp的區(qū)別不在于是否跨域,ajax通過服務(wù)端代理一樣可以實(shí)現(xiàn)跨域,jsonp本身也不排斥同域的數(shù)據(jù)的獲取。

4、還有就是,jsonp是一種方式或者說非強(qiáng)制性協(xié)議,如同ajax一樣,它也不一定非要用json格式來傳遞數(shù)據(jù),如果你愿意,字符串都行,只不過這樣不利于用jsonp提供公開服務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容