始终在jQuery Ajax的post数据上调用JSON.stringify
或任何其他用于预处理数据的函数:) 由于我的服务器端框架,我总是需要在发送数据之前调用JSON.stringify,这是不必要的样板文件,您可能会忘记添加 现在我有:始终在jQuery Ajax的post数据上调用JSON.stringify,jquery,ajax,Jquery,Ajax,或任何其他用于预处理数据的函数:) 由于我的服务器端框架,我总是需要在发送数据之前调用JSON.stringify,这是不必要的样板文件,您可能会忘记添加 现在我有: $.ajax({ [...] data: JSON.stringify({ someData: self.someData }), [...] }); 我希望: $.ajax({ [...] data: { someData: self.someData }, [...] });
$.ajax({
[...]
data: JSON.stringify({ someData: self.someData }),
[...]
});
我希望:
$.ajax({
[...]
data: { someData: self.someData },
[...]
});
我已经研究了ajaxSetup,但目前还没有找到解决方案
更新
关于我需要这个的原因,请参见以下内容。我可以在服务器端解决这个问题,但目前我正在寻找一种在客户端解决这个问题的方法。不,没有内置的方法将数据从对象预处理为JSON。但是,您可以使用
ajaxSetup
和beforeSend
为您执行此操作
$.ajaxSetup({
beforeSend: function(jqXHR,options){
if ( options.contentType == "application/json" && typeof options.data != "string" ) {
options.data = JSON.stringify(options.data);
}
}
});
现在,只要确保在需要向服务器发送json的请求上,将您的contentType
设置为application/json
,这样它就会被if语句捕获。用户Jquery.getJSON()。您可以直接获取json数据
$.getJSON('', function(data) {
//you can use data.
});
这里有一种替代方法,使用: 因为预过滤器在
数据类型
选项上匹配,所以我们必须在$.ajax
请求中手动设置它。如果dataType
与前置过滤器(“json”)匹配,则在发送请求之前,它将data
对象转换为字符串,并将contentType
头设置为匹配(“application/json”)
请记住,这是一个全局性的变化,将影响所有未来的$。ajax
数据类型为的请求:“json”
这是我使用的函数(比beforeSend方法更好),它将匹配任何数据类型,并将序列化post或put请求中的任何对象
$.ajaxPrefilter(function (options, org) {
var rtype = options.type.toLowerCase();
if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
options.data = JSON.stringify(org.data);
}
});
希望这能有所帮助。如果请求的内容类型是JSON,则不需要这样做。您可能会在服务器上无意中序列化数据。。以前发生在我身上..或者你可能必须检查你的
响应类型
。如果它有“text”或“html”,这可能发生$.ajaxSetup({contentType:'json')代码>设置内容类型不会将数据转换为该类型的数据。如果它是一个对象,jQuery仍然会将其传递给$.param
,从而将其转换为序列化数据,例如somedata=foobar&someotherdata=barfoo
,这似乎很有希望-只有jQuery似乎在调用foresend之前做了一些序列化工作。因此,调用在我的模型someData上定义的一些函数()——我使用的是Knockout.js。有没有办法防止这种情况发生?啊,是的,因为beforeSend发生在jquery将对象转换为字符串数据之后。beforeSend在这种情况下不起作用,除非您也使用processData:false
processData:false对我有效,而且是我能负担得起的报价:)谢谢!作为ajax预过滤器,这可能会更好。谢谢!您可以使用if(/POST | PUT | PATCH/.test(options.type)){…}
包装prefilter函数的内部,以仅影响带有主体的请求。
$.ajaxPrefilter(function (options, org) {
var rtype = options.type.toLowerCase();
if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
options.data = JSON.stringify(org.data);
}
});