26

或任何其他功能来预处理您的数据:)

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

现在我有:

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

我会比较喜欢:

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

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

更新

出于我需要这个的原因,请参阅下面的这个问题。我可以在服务器端解决这个问题,但现在我正在寻找一种在客户端解决这个问题的方法。

4

4 回答 4

30

不,没有内置方法可以将数据从对象预处理为 JSON。但是,您可以使用ajaxSetupand abeforeSend来为您做这件事。

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

现在只需确保将您设置contentTypeapplication/json需要将 json 发送到服务器的请求,这样它就会被 if 语句捕获。

于 2013-06-20T14:21:47.697 回答
3

这是一种使用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"

于 2016-08-26T18:13:08.337 回答
1

这是我使用的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);
    }
});

希望这可以帮助。

于 2017-04-07T10:29:40.443 回答
-3

用户Jquery.getJSON()。可以直接获取json数据。

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

//you can use data.
});

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

于 2013-06-20T14:45:53.413 回答