可以在jQuery中处理和过滤JSON响应吗?

可以在jQuery中处理和过滤JSON响应吗?,jquery,ajax,error-handling,Jquery,Ajax,Error Handling,在执行完整或错误之前,是否可以在jQuery.ajax中处理来自服务器的JSON响应 或者让我把问题扩展一下: 在处理每个响应属性的JSON数据时,告诉$.ajax这是一个成功且完整的ajax请求,还是一个错误,因此$.ajax{error:function{};被处决了 Psuedocode示例: 你为什么会问?因为我想在任何地方都使用一个$.ajax语法,并且只使用$.ajax{process:functiondata{};应该随时更改。是的 function setDefaultPoint

在执行完整或错误之前,是否可以在jQuery.ajax中处理来自服务器的JSON响应

或者让我把问题扩展一下:

在处理每个响应属性的JSON数据时,告诉$.ajax这是一个成功且完整的ajax请求,还是一个错误,因此$.ajax{error:function{};被处决了

Psuedocode示例:

你为什么会问?因为我想在任何地方都使用一个$.ajax语法,并且只使用$.ajax{process:functiondata{};应该随时更改。

是的

function setDefaultPoint(){
    var officeId =  $('#clientTrip_officeId').val();

    $.ajax({
        url:"${createLink(controller:'clientTrip',action:'setDefaultPoint')}",
        dataType: "json",
        data: { officeId: officeId },
        success: function(data) {
            console.log(data.defaultPoint.id, data.defaultPoint.name);
            console.log(data.company.id, data.company.name);
        }

    });
}

简单的答案是否定的,除非您想编写自己的JSON解析器

使用标准jQuery特性,ajaxsuccess和error处理程序将分别对成功/失败的数据检索进行响应,而不考虑数据的正确性,除非数据是格式良好的JSON

数据只提供给成功处理程序,因此如果要过滤它,必须在其中进行过滤

好消息是,您可以通过自己控制的$延迟来获得所需的操作,这将根据您选择的任何条件在两个处理程序中进行解析/拒绝。这通常是在返回延迟的承诺的函数中完成的

代码如下所示:

function getData() {
    var dfrd = $.Deferred();
    $.ajax({
        url: 'script.php',
        type: 'POST',
        data: {some: 'data-1'},
        dataType: 'json'
    }).done(function(data, textStatus, jqXHR) {
        if(data.success == true && (data.data.length > 0)) {
            dfrd.resolve(data, textStatus, jqXHR);
        } else {
            dfrd.reject(jqXHR, "client-side error", "data.success==false and/or data.data.length==0");
        }
    }).fail(dfrd.reject);
    return dfrd.promise();
}
因此,该函数执行您需要的附加检查,并且返回的承诺模拟jqXHR的完成/失败特性


为返回的promise提供jqXHR的全部功能需要更多的考虑,例如.abort方法。

有用于ajax事件的全局事件处理程序:

$(document).ajaxComplete() //called when Ajax requests complete
$(document).ajaxError() //called when Ajax requests complete with an error
$(document).ajaxSend() //executed before an Ajax request is sent
$(document).ajaxStart() //called when the first Ajax request begins
$(document).ajaxStop() //called when all Ajax requests have completed
$(document).ajaxSuccess() 
//function to be executed whenever an Ajax request completes successfully
以及ajax设置:

$(document).ajaxSetup({
    url: 'script.php',
    type: 'POST',
    data: '{}',
    dataType: 'json'
});
然后你可以打电话:

 $.ajax({ data: myData });
它使用了以上所有功能

下面是一个使用asp.net的示例,其中它发回.d属性,并将其转换为所需的JSON:

$(document).ajaxSetup({
    data: "{}",
    dataType: "json",
    type: "POST",
    contentType: "application/json",
    converters: {
        "json jsond": function(msg) {
            return msg.hasOwnProperty('d') ? msg.d : msg;
        }
    },
    error: function(xhr, textStatus, errorThrown) {
        var errorMessage = "Ajax error: " + this.url
             + " : " + textStatus + " : " + errorThrown 
             + " : " + xhr.statusText + " : " + xhr.status;
        alert(errorMessage);
        if (xhr.status != "0" || errorThrown != "abort") {
            alert(errorMessage);
        }
    }
});

注意:此转换器在成功或完成之前执行-因此我认为这就是您要问的问题。

您到底想要什么?只需以结构化格式构建应用程序以处理服务器响应。对不起,这个问题没有多大意义。美元.ajax不是这样工作的吗?你能给出一些示例代码来说明你想要什么吗?我已经编辑了我的问题并添加了一个伪代码,请现在查看
$(document).ajaxSetup({
    data: "{}",
    dataType: "json",
    type: "POST",
    contentType: "application/json",
    converters: {
        "json jsond": function(msg) {
            return msg.hasOwnProperty('d') ? msg.d : msg;
        }
    },
    error: function(xhr, textStatus, errorThrown) {
        var errorMessage = "Ajax error: " + this.url
             + " : " + textStatus + " : " + errorThrown 
             + " : " + xhr.statusText + " : " + xhr.status;
        alert(errorMessage);
        if (xhr.status != "0" || errorThrown != "abort") {
            alert(errorMessage);
        }
    }
});