【问题标题】:Why is it that sometimes I have to JSON.parse() my AJAX response?为什么有时我必须 JSON.parse() 我的 AJAX 响应?
【发布时间】:2015-11-01 15:33:58
【问题描述】:

关于我的客户端 jQuery 如何通过服务器端 PHP 处理我的 JSON ajax 响应,我有一些不一致的地方。

这是我有的两个示例 ajax 调用:

function checkOrders() {

    $.ajax({
        type: "POST" ,
        url:"/service/index.php" ,
        data: {
            q: "checkOrders"
        } ,
        complete: function(result) {

            // note here the JSON.parse() clause
            var x = JSON.parse(result.responseText);

            if (x['unhandled_status']>0) {

                noty({
                    text: '<center>There are currently <b>'+x['unhandled_status']+'</b> unhandled Orders.',
                    type: "information",
                    layout: "topRight",
                    modal: false ,
                    timeout: 5000 
                    }
                });             

            }

        } ,

        xhrFields: {
            withCredentials: true
        }
    });

}

请注意,在上面的示例中,我必须在我的 PHP 页面中 JSON.parse() responseText 才能将其作为对象处理。它以某种方式将整个 PHP 响应视为一个对象,我必须从该对象中提取 responseTextJSON.parse() 才能使用它。

现在这里是我的另一个 ajax 调用,返回的响应,我可以直接用作 json 响应 - 意思是,不知何故 PHP 页面不返回完整的“对象”,但只返回 json 和我的 ajax 调用不知何故已经知道它是 JSON,我不需要 JSON.parse() 它:

function getUnfiledOrders() {

$.ajax({
    type: "POST" ,
    url:"/service/index.php" ,
    data: {
        queryType: "getUnfiledOrders"
    } ,
    success: function(result) {

        if (result['total_records'] >0) {
            noty({
                text: result['response'],
                type: "error",
                modal: false,
                dismissQueue: true,
                layout: "topRight",
                theme: 'defaultTheme'
            });
        }
    } ,
    xhrFields: {
        withCredentials: true
    }
});

}

在这种情况下,我不需要 JSON.parse() responseText 来将响应视为 JSON 对象。

两个 PHP 响应脚本如下所示:

 header('content-type:application/json');
 $array = array("total_records"=>3,"response"=>"SUCCESS");
 echo json_encode($array);

有人能告诉我这种不均匀性吗?

编辑:

我意识到在上述每个 ajax 调用中都有两个不同的回调。一个在complete,另一个在success

当我将它们都切换到 success 时,我的 ajax 请求返回的响应得到统一处理。

所以我想我现在的问题是:

  • 为什么这两个回调之间存在不一致?
  • 哪个更好用?

【问题讨论】:

    标签: php json ajax


    【解决方案1】:

    我刚刚彻底审查了 $.ajax() 上的文档,如 here 所述。

    无论如何,简单的是completesuccess在函数中加载了不同的变量。

    complete 返回:

    完成
    类型:函数(jqXHR jqXHR, String textStatus)

    success 返回:

    成功
    类型:函数(任何数据,字符串 textStatus,jqXHR jqXHR)

    当我有complete 时,返回的第一个参数是一个对象,所以我必须使用:

    complete: function(data) {
     var x = JSON.parse(data.responseText);
    }
    

    因为我必须在返回的对象中获取 responseText - 它有一个字符串值(不一定是 JSON 格式)。

    success 函数作为第一个变量返回从 PHP 传递的任何内容。在这种情况下,它是一个 json_encoded 字符串。所以它会返回它,你可以在它返回后立即使用它,无需进一步操作。

    哒哒!

    另外,请注意 .success() 仅在服务器响应为 200 时才被调用,.complete() 将始终被调用,无论状态码如何

    【讨论】:

      【解决方案2】:

      我之前的回答不适用于您的问题,尽管您(和每个人)可能需要注意这一点。

      关于您关于completesuccess 的观点——是的,返回值的顺序不同。不过,您不需要完整解析文本。 jqXHR 响应有一个 responseJSON 对象,您可以直接使用它。

      http://api.jquery.com/jQuery.ajax/#jqXHR

      之前的回复

      您是否使用表单按钮从表单中调用checkOrders

      我发现 JQuery 期望在这些情况下对数据进行表单编码,不管你告诉它你期望 JSON。

      jquery ajax returns success when directly executed, but returns error when attached to button, even though server response is 200 OK

      不确定这是设计使然还是错误。

      如果是这种情况,请尝试将form 标记更改为div,或将按钮放在表单之外。

      【讨论】:

        【解决方案3】:

        在你的情况下,我只会使用$.getJSON,如下所示:

        $.getJSON( "api.php", { user: "John", password: "1234" } )
          .done(function( json ) {
            console.log( "JSON object: " + json.friends[ 3 ].name );
          })
          .fail(function( jqxhr, textStatus, error ) {
            console.log( "Sorry, the request failed.");
        });
        

        这样可以确保答案始终是 js 对象。

        希望这有帮助, 塞巴斯蒂安

        【讨论】:

        • 这真的有助于解释为什么这被否决了。它确实解决了你的问题,对吧?如果我错了,请纠正我...
        • 如何从 $.getJSON 调用中调用 ajax?也许你可以更好地解释这一点。它是否总是导致对象与 $.ajax() 调用相反?再说一次,我没有对你投反对票....
        • getJSON 调用总是产生一个对象,该对象已经被解析为 JSON。它基本上是 .ajax() 的简写,并设置了一些默认值。更多细节在这里:api.jquery.com/jquery.getjson
        • 我明白了。好的,你能帮我澄清一下我什么时候想使用 $.ajax() 而不是 $.getJSON() 吗?毕竟,ajax 的意义在于您试图从服务器获得响应。 JSON是这些天的标准,所以想知道我是否错过了 $.ajax() 调用的其他用途...... Tku!
        • Ajax 用于从服务器请求内容。例如,您可以请求 JSON 从服务器检索数据。但您也可以使用 JSON 从服务器检索图像或其他内容。有很多可能性。 getJSON 只是通过从您的 ajax 函数中删除不必要的混乱来为您简化事情。这就是速记的用途。 :-)
        猜你喜欢
        • 1970-01-01
        • 2017-04-10
        • 2014-11-08
        • 2013-10-23
        • 2015-04-04
        • 2011-01-28
        • 2015-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多