用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对象,success
callback,所以你不需要指定dataType
属性。
要小心的事情是:
- 你所说的
arr
不是一个数组 。 这是一个具有属性(City
和Age
)的JavaScript对象。 数组在javascript中用[]
表示。 例如[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]
是一个由2个物体组成的数组。
因为默认情况下,jQuery将作为data
parameter 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); } } );