如何发送 JSON 而不是查询字符串与 $. ajax?

有人能简单地解释一下如何让 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[]: [],这可能是由于查询的限制。

288085 次浏览

您需要使用 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

不,dataType选项是用来解析接收到的数据的。

要发布 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 库。

如果您要将其发送回 asp.net,并且需要 request.form []中的数据,那么需要将内容类型设置为“ application/x-www-form-urlencode; charset = utf-8”

原帖 给你

其次,去掉数据类型,如果你不期待返回的 POST 将等待约4分钟才失败。参见 给你

虽然我知道很多像 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
});