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

时间:2013-03-01 12:29:27

标签: jquery ajax error-handling

在执行jQuery.ajax()complete之前,是否可以在error中处理来自服务器的JSON响应?

或者让我延伸一下这个问题:

在处理JSON数据(每个响应属性)时,告诉$.ajax()它是successcomplete AJAX请求,还是error,所以{ {1}}被执行了吗?


示例Psuedocode:

$.ajax({error: function() {} });

为什么你会问?因为我想在任何地方使用单个$.ajax({ url: 'script.php', type: 'POST', data: {some: 'data-1'}, dataType: 'json', process: function(data) { if(data.success == true && (data.data.length > 0)) { this.success = true; } else { this.success = false; } }, success: function() { if( this.success == true ) { // it was a success } }, error: function() { if( this.success == false ) { alert('there was an error'); } } }); 语法,并且只应随时更改$.ajax()

3 个答案:

答案 0 :(得分:0)

是的

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

    });
}

答案 1 :(得分:0)

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

使用标准的jQuery功能,AJAX成功和错误处理程序将分别响应成功/不成功的数据检索而触发,而不考虑数据的正确性,而不是形成良好的JSON。

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

好消息是,您可以使用$.Deferred()在您自己的控制下获得所需的操作,并在两个处理程序中的任何一个中解决/拒绝以响应您选择的任何条件。这通常在返回Deferred的承诺的函数内部完成。

代码将是这样的:

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();
}

因此,该函数执行您需要的附加检查,并且返回的promise会模拟jqXHR的完成/失败特征。

需要更多考虑让返回的承诺具有jqXHR的全部功能 - 例如。 .abort()方法。

答案 2 :(得分:0)

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

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