为什么有时我需要JSON.parse()我的AJAX响应?

时间:2015-11-01 15:33:59

标签: php json ajax

关于我的客户端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页面不会返回一个完整的&#34;对象&#34;但只返回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请求返回的响应被统一处理。

所以我现在的问题是:

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

3 个答案:

答案 0 :(得分:2)

我刚刚审核了有关{。{3}}的$ .ajax()上的文档。

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

complete会返回此信息:

  

完整
  键入:Function(jqXHR jqXHR,String textStatus)

success会返回此信息:

  

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

当我有complete时,返回的第一个参数是一个对象,这就是我必须使用的原因:

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

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

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

钽DAH!

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

答案 1 :(得分:1)

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

关于complete vs success的观点 - 是的,返回的值的顺序不同。不过,您还不需要在完成时解析文本。 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,或将按钮放在表单之外。

答案 2 :(得分:0)

在您的情况下,我只会使用$.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对象。

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