用jQuery发送JSON数据

为什么代码下面发送的数据为City=Moscow&Age=25而不是JSON格式?

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

因为您没有指定请求内容types,也没有指定正确的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对象转换成一个原生的JSONstring,并embedded到现代浏览器中。 如果你想支持旧的浏览器,你可能需要包含json2.js
  • 使用contentType属性指定请求内容types,以便向服务器指示发送JSON请求的意图
  • dataType: 'json'属性用于您期望从服务器获取的响应types。 jQuery足够聪明,可以从服务器的Content-Type响应头中猜出它。 所以,如果你有一个Web服务器,或多或less的HTTP协议,并响应Content-Type: application/json到你的请求,jQuery会自动将响应转换成一个JavaScript对象, successcallback,所以你不需要指定dataType属性。

要小心的事情是:

  • 你所说的arr 不是一个数组 。 这是一个具有属性( CityAge )的JavaScript对象。 数组在javascript中用[]表示。 例如[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]是一个由2个物体组成的数组。

因为默认情况下,jQuery将作为dataparameter passing的对象序列化为$.ajax 。 它使用$.param将数据转换为查询string。

$.ajax的jQuery文档:

[ data参数]被转换为查询string,如果还不是string的话

如果你想发送JSON,你必须自己编码:

 data: JSON.stringify(arr); 

请注意, JSON.stringify只存在于现代浏览器中。 对于传统支持,请查看json2.js

我写了一个简短的便利函数发布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); }); 

它被序列化,以便URI可以在默认情况下读取POST请求中的名称值对。 您可以尝试将processData:false设置为params列表。 不知道这是否有帮助。

您需要设置正确的内容types并将您的对象string化。

  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); } } );