真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

json與jsonp區(qū)別及通過ajax獲得json數(shù)據(jù)后格式轉(zhuǎn)換的示例分析

json與jsonp區(qū)別及通過ajax獲得json數(shù)據(jù)后格式轉(zhuǎn)換的示例分析,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

為平定等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及平定網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站建設(shè)、平定網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

 有關(guān)json與jsonp的區(qū)別(json才是目的,jsonp只是手段)介紹如下所示:

一言以蔽之,json返回的是一串?dāng)?shù)據(jù);而jsonp返回的是腳本代碼(包含一個(gè)函數(shù)調(diào)用);

JSON其實(shí)就是JavaScript中的一個(gè)對象,跟var obj={}在質(zhì)上完全一樣,只是在量上可以無限擴(kuò)展。簡單地講,json其實(shí)就是JavaScript中的對象(Object)和數(shù)組(Array,其實(shí)也是對象)這倆好基友在那兒你嵌我我嵌你地套上n多層,以此模擬出許多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

json易于人閱讀和編寫,也易于機(jī)器解析和生成,相對網(wǎng)絡(luò)傳輸速率較高,功能型網(wǎng)站前后端往往要頻繁大量交換數(shù)據(jù),而json憑借其強(qiáng)大的表現(xiàn)力和高顏值漸漸地成為理想的前后端數(shù)據(jù)交換語言。那xml前輩呢,我覺得應(yīng)該會像微軟的xp那樣功成身退。

同源(不懂同源策略的童鞋請自行百度)下的前后端數(shù)據(jù)交換格式確定使用json了,那么問題來了,如果我想獲取別人網(wǎng)站上提供的數(shù)據(jù)腫么做到呢?也就是跨域讀取數(shù)據(jù)問題(不要鉆牛角說你不需要讀取其他網(wǎng)站的數(shù)據(jù),相信我,你早晚得需要),json行不行呢?答案是No Way,為什么呢,因?yàn)閖son只是普通的文本格式,能讓你這樣就輕松拿到那服務(wù)端就沒有任何安全和保密性可言了,這樣的話互聯(lián)網(wǎng)世界非亂套不可,這個(gè)問題那些牛X的規(guī)范制定者早就想到了,所以使用了同源策略來限制文件獲取。最后的結(jié)果就是只有像img、script、iframe這類可以指定src屬性的標(biāo)簽有跨域獲取別人網(wǎng)站上數(shù)據(jù)(圖片,腳本,源文件其實(shí)都是數(shù)據(jù))的能力。比如:




看來直接獲取json是行不通了,那有沒有其他方法能拿到數(shù)據(jù)呢?于是乎jsonp就這樣被聰明的開發(fā)者給發(fā)現(xiàn)了,為什么說是發(fā)現(xiàn)而不是發(fā)明呢,因?yàn)椴]有涉及到任何新技術(shù),就像發(fā)現(xiàn)ajax一樣。

jsonp原理是這樣的,網(wǎng)站A需要獲取網(wǎng)站B的數(shù)據(jù),網(wǎng)站B說我給你們一個(gè)方法,【1. 你們使用標(biāo)簽先獲取到open.js文件(網(wǎng)站B的責(zé)任),這里邊有你們需要的數(shù)據(jù)。2. 你們獲取數(shù)據(jù)后處理數(shù)據(jù)(總得處理數(shù)據(jù)吧)的方法名必須命名為foo(數(shù)據(jù)請求者的責(zé)任和義務(wù))】,這里相當(dāng)于B網(wǎng)站和請求獲取數(shù)據(jù)者之間建立了一個(gè)協(xié)議,要求請求者務(wù)必按照規(guī)則辦事,如果請求者不能同時(shí)遵守上面兩條就不能按預(yù)期獲取數(shù)據(jù)。額..,這也算相當(dāng)于建立了一個(gè)潛規(guī)則吧

open.js內(nèi)容

foo({"name":"B","age":23});  //為什么不直接寫成json數(shù)據(jù){"name":"B","age":23}呢,原因很簡單,在js文件總得合乎js語法吧
//這也是為什么協(xié)議中明確規(guī)定處理數(shù)據(jù)的方法名必須命名為foo,因?yàn)锽網(wǎng)站是在假定請求者的腳本中已經(jīng)定義了數(shù)據(jù)處理方法foo的情況下返回?cái)?shù)據(jù);
//不然就會報(bào)foo is not defined錯(cuò)誤

網(wǎng)站A腳本須有

function foo(data){
console.log(data);
//ToDo.. 
}

??!雖然拐了個(gè)彎,但數(shù)據(jù)總算得到了,網(wǎng)站A,網(wǎng)站B都非常高興,那么問題又來了,網(wǎng)站C說也需要獲取網(wǎng)站B的數(shù)據(jù),網(wǎng)站B把協(xié)議甩給它,網(wǎng)站C拿過來一看,草泥馬啊,foo這個(gè)名字已經(jīng)在自己的腳本文件的6868行用過了,而且已經(jīng)使用在腳本的各個(gè)角落,批量替換會導(dǎo)致很多潛在bug啊,網(wǎng)站B情急之下決定把foo改成fool,網(wǎng)站A立馬蹦起來,因?yàn)樽约旱木W(wǎng)站已經(jīng)在很多地方使用foo引用了數(shù)據(jù)。

為了避免上面情況發(fā)生,那些牛X哄哄的開發(fā)者使用了動態(tài)生成js文件的方法,php版本如下:

open.php

額 ..,至于php為什么能返回js格式文件,自行百度。

于是網(wǎng)站A用來請求數(shù)據(jù),不需要修改任何變量,返回給A的腳本文件內(nèi)容是:

foo({"name":"B","age":23}); //所謂的jsonp,就是一句函數(shù)調(diào)用,數(shù)據(jù)都被包裹傳遞到參數(shù)中了,千萬別穿個(gè)馬甲就不認(rèn)識了 
網(wǎng)站C就用來請求數(shù)據(jù),返回給C的腳本文件內(nèi)容是:
blah({"name":"B","age":23}); 
網(wǎng)站N就用來請求數(shù)據(jù),返回給N的腳本文件內(nèi)容是:
what({"name":"B","age":23});

Problem Solved,大家都取到了期望的數(shù)據(jù),并且避免了命名沖突。

jsonp全名叫做json with padding,很形象,就是把json對象用符合js語法的形式包裹起來以使其它網(wǎng)站可以請求得到,也就是將json數(shù)據(jù)封裝成js文件;

json是理想的數(shù)據(jù)交換格式,但沒辦法跨域直接獲取,于是就將json包裹(padding)在一個(gè)合法的js語句中作為js文件傳過去。這就是json和jsonp的區(qū)別,json是想要的東西,jsonp是達(dá)到這個(gè)目的而普遍采用的一種方法,當(dāng)然最終獲得和處理的還是json。所以說json是目的,jsonp只是手段。json總會用到,而jsonp只有在跨域獲取數(shù)據(jù)才會用到。

理解了json和jsonp的區(qū)別之后,其實(shí)ajax里的跨域獲取數(shù)據(jù)就很好理解和實(shí)現(xiàn)了,同源時(shí)候并沒有什么特別的,直接取就行,跨域時(shí)候需要拐個(gè)彎來達(dá)到目的。

附上jquery中ajax請求json數(shù)據(jù)實(shí)例:

(同源):

$.ajax({
url:"persons.json",
success:function(data){
    console.log(data);
     //ToDo..
  }
});

(跨域):

$.ajax({
url:"http://www.B.com/open.php?callback=?",
dataType:"jsonp",
success:function(data){
console.log(data);
//ToDo..
}
});

jquery已把jsonp封裝進(jìn)ajax,很合理,因?yàn)楫吘菇^大多數(shù)的jsonp請求都是ajax,關(guān)于jquery的ajax具體用法請自行百度,另外要注意的一點(diǎn)就是不同的網(wǎng)站提供的數(shù)據(jù)接口的$_REQUEST ['callback']中不一定絕對是callback也可能是cb,cbk等,具體使用時(shí)務(wù)必閱讀服務(wù)端提供的有關(guān)接口使用的詳細(xì)文檔。

下面給大家介紹下由“夜未央0906”寫的通過ajax獲得json數(shù)據(jù)后格式的轉(zhuǎn)換

在有些情況下獲取到的json數(shù)據(jù)可能是string類型的,需要把其格式化為json對象才方便解析。

a)原生js通過ajax獲取到的json

此時(shí)返回的數(shù)據(jù)默認(rèn)是string型的,所以需要用eval()函數(shù)將其轉(zhuǎn)化為json對象。需要注意函數(shù)內(nèi)字符串的格式:eval(“(” + data+“)”),因?yàn)榉祷氐膕tring是在{}里面的,eval會將大括號識別為js代碼塊開始和結(jié)束的標(biāo)志,所以必須加上(),將其強(qiáng)制轉(zhuǎn)化為對象來處理。

b)jquery獲取

1:通過ajax()異步請求并把type設(shè)置為json,返回的就是json對象。

2:通過用與ajax()等價(jià)的$.getJSON(url,data1,function(data2,status,xhr){//......})方法獲取的也是json對象。其中data1為連同請求發(fā)送的數(shù)據(jù),data2為服務(wù)器返回的數(shù)據(jù)即json對象。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


新聞標(biāo)題:json與jsonp區(qū)別及通過ajax獲得json數(shù)據(jù)后格式轉(zhuǎn)換的示例分析
文章轉(zhuǎn)載:http://weahome.cn/article/ishhjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部