有人能否以简单的方式解释如何让jQuery发送实际的JSON而不是查询字符串?
$.ajax({
url : url,
dataType : 'json', // I was pretty sure this would do the trick
data : data,
type : 'POST',
complete : callback // etc
});
这实际上将您精心准备的JSON转换为查询字符串。令人讨厌的事情之一是,对象中的任何array: []
都将转换为array[]: []
,可能是因为查询sting的限制。
答案 0 :(得分:241)
您需要使用JSON.stringify
首先将对象序列化为JSON,然后指定contentType
,以便您的服务器了解它的JSON。这应该可以解决问题:
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
contentType: "application/json",
complete: callback
});
请注意,JSON
对象在支持JavaScript 1.7 / ECMAScript 5或更高版本的浏览器中原生可用。如果您需要旧版支持,可以使用json2。
答案 1 :(得分:26)
不,dataType
option用于解析收到的数据。
要发布JSON,您需要通过JSON.stringify
自行对其进行字符串化,并将processData
选项设置为false
。
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
processData: false,
contentType: "application/json; charset=UTF-8",
complete: callback
});
请注意,并非所有浏览器都支持JSON
对象,尽管jQuery具有.parseJSON
,但它没有包含字符串;你需要另一个polyfill库。
答案 2 :(得分:5)
虽然我知道像ASP.NET MVC这样的许多架构都有内置的功能来处理JSON.stringify作为contentType我的情况有点不同所以这可能会对将来有所帮助。我知道这会节省我几个小时!
由于我的http请求是由来自IBM(AS400环境)的CGI API在不同的子域上处理的,因此这些请求是交叉源,因此是jsonp。我实际上是通过javascript对象发送我的ajax。这是我的ajax POST的一个例子:
var data = {USER : localProfile,
INSTANCE : "HTHACKNEY",
PAGE : $('select[name="PAGE"]').val(),
TITLE : $("input[name='TITLE']").val(),
HTML : html,
STARTDATE : $("input[name='STARTDATE']").val(),
ENDDATE : $("input[name='ENDDATE']").val(),
ARCHIVE : $("input[name='ARCHIVE']").val(),
ACTIVE : $("input[name='ACTIVE']").val(),
URGENT : $("input[name='URGENT']").val(),
AUTHLST : authStr};
//console.log(data);
$.ajax({
type: "POST",
url: "http://www.domian.com/webservicepgm?callback=?",
data: data,
dataType:'jsonp'
}).
done(function(data){
//handle data.WHATEVER
});
答案 3 :(得分:1)
如果你要将它发送回asp.net并需要request.form []中的数据,那么你需要将内容类型设置为“application / x-www-form-urlencoded; charset = utf-8 “
原帖[{3}}
其次摆脱数据类型,如果你不期望返回,POST将在失败前等待大约4分钟。见here