【问题标题】:Is it possible to process and filter JSON response in jQuery?是否可以在 jQuery 中处理和过滤 JSON 响应?
【发布时间】:2013-03-01 12:29:26
【问题描述】:

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

或者让我扩展一下问题:

在处理 JSON 数据(每个响应属性)时,告诉 $.ajax()successcomplete AJAX 请求,还是 error,所以 $.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() 语法,并且只需要不时更改$.ajax({ process: function(data) {} });

【问题讨论】:

  • 你到底想要什么?
  • 只需以结构化格式构建您的应用程序以处理服务器响应。
  • 对不起,这个问题没有多大意义。 $.ajax() 不是这样吗?您能否提供一些示例代码来显示您想要的内容?
  • 我已经编辑了我的问题并添加了一个伪代码,请立即查看

标签: jquery ajax error-handling


【解决方案1】:

是的

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

    });
}

【讨论】:

    【解决方案2】:

    简单的答案是否定的,除非您想编写自己的 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 的完成/失败特征。

    要让返回的 Promise 具有 jqXHR 的全部功能需要更多的思考——例如。 .abort() 方法。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2019-04-29
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 2021-04-19
        相关资源
        最近更新 更多