Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
始终在jQuery Ajax的post数据上调用JSON.stringify_Jquery_Ajax - Fatal编程技术网

始终在jQuery Ajax的post数据上调用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 }, [...] });

或任何其他用于预处理数据的函数:)

由于我的服务器端框架,我总是需要在发送数据之前调用JSON.stringify,这是不必要的样板文件,您可能会忘记添加

现在我有:

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