JSON和JSONP的區別,以及使用方法

(一)場景

在拉京東城市選擇的基礎數據時候,遇到被服務器拒絕的狀況,也就是ajax跨域問題javascript

(二)json和jsonp

說的直白一點,在咱們作ajax異步的一些功能的時候,必定會或多或少的遇到兩個問題,(一、數據的交換。二、跨域問題)java

JSONP的最基本的原理是:動態添加一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了。咱們在用其餘關於src的標籤的時候,均可以跨域。因此咱們只要動態構造的src標籤一樣能夠作到跨域。jquery

<script type="text/javascript">
function <span style="color: #ff0000;">jsonpCallback</span>(result)  
            {  
            alert(result.msg);  
            }
   </script>
<script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=<span style="color: #ff0000;">jsonpCallback</span>"></script>

從紅色的地方能夠看出,兩個名字要一直,不過通常採用callback而後後面加一個「?」此時jquery會自動生成一個函數名,這樣能夠作到發送不少請求的時候,並不會互相影響。ajax

同源策略 :即JavaScript只能訪問與包含它的文檔在同一域下的內容。json

jsonp能夠跨越同源策略,當咱們使用了jsonp,將會是另一種協議通訊了。跨域

JSONP的優勢是:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中均可以運行,不須要XMLHttpRequest或ActiveX的支持;而且在請求完畢後能夠經過調用callback的方式回傳結果。瀏覽器

JSONP的缺點則是:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種狀況,不能解決不一樣域的兩個頁面之間如何進行JavaScript調用的問題。服務器

(三)使用方法

$.getJSON("http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?", 
    function(json){ 
    if(json.屬性名==值){ 
        // 執行代碼 
    } 
});
$.ajax({
    async:false,
    url: http://跨域的dns/document!searchJSONResult.action,
    type: "GET",
    dataType: 'jsonp',

一般狀況通常是這兩種使用方法,在跨域問題上,很是簡單。dom

在這裏附一個json的處理方法異步

public static Object[] getDTOArray(String jsonString, Class<?> clazz){
net.sf.json.JSONArray array = net.sf.json.JSONArray.fromObject(jsonString);
Object[] obj = new Object[array.size()];
for(int i = 0; i < array.size(); i++){
net.sf.json.JSONObject jsonObject = array.getJSONObject(i);
obj[i] = net.sf.json.JSONObject.toBean(jsonObject, clazz);
}
return obj;
}
相關文章
相關標籤/搜索