总是在jQuery Ajax的post数据上调用JSON.stringify

时间:2013-06-20 14:15:06

标签: jquery ajax

或者为此事预处理数据的任何其他功能:)

由于我的服务器端框架,我总是需要在发送数据之前调用JSON.stringify - 不必要的样板,你可以忘记添加。

现在我有:

$.ajax({
    [...]
    data: JSON.stringify({ someData: self.someData }),
    [...]
});

我更愿意:

$.ajax({
    [...]
    data: { someData: self.someData },
    [...]
});

我已经研究过ajaxSetup,但到目前为止找不到解决方案......

更新

由于我需要这个的原因,请参阅以下this question。我可以在服务器端解决这个问题,但是现在我正在寻找一种方法来解决这个问题。

4 个答案:

答案 0 :(得分:28)

不,没有内置方法可以将数据从对象预处理到JSON。但是,您可以使用ajaxSetupbeforeSend为您执行此操作。

$.ajaxSetup({
    beforeSend: function(jqXHR,options){
        if ( options.contentType == "application/json" && typeof options.data != "string" ) {
            options.data = JSON.stringify(options.data);
        }
    }
});

现在只需确保将contentType设置为application/json就需要将json发送到服务器的请求,以便它被if语句捕获。

答案 1 :(得分:2)

这是一种使用jQuery.prefilter的替代方法:

$.ajaxPrefilter("json", function(options, originalOptions) {
  options.data = JSON.stringify(originalOptions.data || null);
  options.contentType = "application/json" // content type of *request*
});

$.ajax({
  data: {foo: [1,2,3]},
  dataType: "json" // expected content type of *response* (must match prefilter, above!)
  [...]
});

由于预过滤器与dataType选项匹配,因此我们必须在$.ajax请求中手动设置它。如果dataType匹配预过滤器(" json"),那么在发送请求之前,它会将data对象转换为字符串,并设置contentType标头匹配(" application / json")。

请注意,此次全局更改会影响$.ajax以后的所有dataType: "json"次请求!

答案 2 :(得分:0)

这里是我使用的jQuery.prefilter函数(它比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);
    }
});

希望这会有所帮助。

答案 3 :(得分:-3)

User Jquery.getJSON()。您可以直接获取json数据。

$.getJSON('', function(data) {

//you can use data.
});

http://api.jquery.com/jQuery.getJSON/