2011-07-05 111 views
54

爲什麼下面的代碼發送數據爲City=Moscow&Age=25而不是JSON格式?用jQuery發送JSON數據

var arr = {City:'Moscow', Age:25}; 
$.ajax(
    { 
     url: "Ajax.ashx", 
     type: "POST", 
     data: arr, 
     dataType: 'json', 
     async: false, 
     success: function(msg) { 
      alert(msg); 
     } 
    } 
); 
+2

dataType是什麼返回,不是什麼發送! – Gal

+0

嘗試將'dataType'放在數據...不確定。 – daGrevis

+1

爲防止將數據轉換爲查詢字符串格式集「processData:false」。請參閱http://api.jquery.com/jquery.ajax/#sending-data-to-server – Paul

回答

142

因爲您沒有指定請求內容類型,也沒有指定正確的JSON請求。下面是發送一個JSON請求的正確方法:

var arr = { City: 'Moscow', Age: 25 }; 
$.ajax({ 
    url: 'Ajax.ashx', 
    type: 'POST', 
    data: JSON.stringify(arr), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: false, 
    success: function(msg) { 
     alert(msg); 
    } 
}); 

事情需要注意:

  • JSON.stringify方法爲JavaScript對象轉換成JSON字符串,它是天然的,並內置了現代瀏覽器的使用方法。如果你想支持舊的瀏覽器,你可能需要包括json2.js
  • 指定以指示服務器發送一個JSON請求
  • dataType: 'json'屬性用於響應的意圖使用contentType屬性的請求內容類型鍵入您期望從服務器。 jQuery足夠智能猜測它從服務器Content-Type響應標題。所以,如果你有一個或多或少的HTTP協議的web服務器和響應您的請求Content-Type: application/json jQuery將自動解析回調到一個javascript對象到success回調,所以你不需要指定dataType屬性。

事情要小心:

  • 你叫什麼arr不是數組。它是一個具有屬性的javascript對象(CityAge)。數組在JavaScript中用[]表示。例如[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]是一個由2個對象組成的數組。
+0

嗨我已經在我的代碼中測試過它,但它不起作用http://pastie.org/pastes/7975866/文字爲什麼? – Michelangelo

+0

JavaScript中的技術對象只是關聯數組。所以雖然這樣做很困惑,但在JavaScript中調用一個數組對象並不是一個錯誤。 欲瞭解更多信息,請參閱:[JavaScript數據結構](http://www.i-programmer.info/programming/javascript/1441-javascript-data-structures-the-associative-array.html) – Nadav

8

因爲默認情況下,jQuery會將作爲data參數傳遞給對象的對象序列化爲$.ajax。它使用$.param將數據轉換爲查詢字符串。

從jQuery文檔的$.ajax

[中data參數]被轉換成一個查詢字符串,如果不是已經是一個字符串

如果你想發送JSON,你會必須自己對其進行編碼:

data: JSON.stringify(arr); 

注意JSON.stringify只是在現代瀏覽器中存在。對於傳統支持,請查看json2.js

0

它被序列化,以便默認情況下URI可以讀取POST請求中的名稱值對。您可以嘗試將processData:false設置爲params列表。不知道這是否有幫助。

0

您需要設置正確的內容類型並將您的對象字符串化。

var arr = {City:'Moscow', Age:25}; 
$.ajax(

      { 
       url: "Ajax.ashx", 
       type: "POST", 
       data: JSON.stringify(arr), 
       dataType: 'json', 
       async: false, 
       contentType: 'application/json; charset=utf-8', 
       success: function(msg) { 
        alert(msg); 
       } 
      } 
     ); 
+0

這不起作用在所有。沒有發佈變量。 – Michelangelo

+0

@Michelangelo然後你做錯了。 –

3

我寫了一個簡短的便捷函數發佈JSON。

$.postJSON = function(url, data, success, args) { 
    args = $.extend({ 
    url: url, 
    type: 'POST', 
    data: JSON.stringify(data), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: true, 
    success: success 
    }, args); 
    return $.ajax(args); 
}; 

$.postJSON('test/url', data, function(result) { 
    console.log('result', result); 
});