来自jQuery Ajax的json响应为null

时间:2011-03-02 22:44:59

标签: jquery ajax json

它再次深夜,我正撞在墙上。

我有一个jquery ajax调用:

    function waitForMsg(){


    $.ajax({
        type: "GET",
        url: "backend.php",
        async: true,
        cache: false,
        dataType: 'json',
        timeout: 50000, /* Timeout in ms */
                    data: "TimeStamp=" + TimeStamp,
        success: function(data){

                        var json = eval('(' + data + ')');

                        $('#TextHistory :last-child').after('<p>' + json.message + '</p>');

          TimeStamp = json['timestamp'];

            setTimeout(
                waitForMsg, /* Request next message */
                5000            /* ..after 5 seconds */
            );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){

            $('#TextHistory :last-child').after('<p>' + errorThrown + '</p>');

            setTimeout(
                'waitForMsg()', /* Try again after.. */
                "15000");       /* milliseconds (15seconds) */
        },
    });
};

到backend.php,目前看起来像:

<?php

header('Content-Type: application/json');

$response = array();

$response["message"] = "Blarde Bar Blar";

$response["timestamp"] = $LastMsgUpdated;   // part of bigger script this is taken from.

echo json_encode($response);

?>

...但是当ajax成功函数运行时,我在firebug中得到一条消息,说“json.msg为null”......当我在监视窗口中查看json对象时,它显示为null。我正在努力学习这一点,所以不确定我是在做一些有趣的事情,或者我是否只是错过了一些愚蠢的事情。我还注意到firebug中没有任何响应头。当他们明显位于backend.php的顶部时,怎么会这样呢......这么奇怪,让我的头受伤......需要睡觉。

提前感谢您的帮助。 丹

2 个答案:

答案 0 :(得分:2)

当您将data选项设置为dataType时,传递给回调的json已经是JavaScript对象:

  

“json”:将响应评估为JSON并返回JavaScript对象。在jQuery 1.4中,JSON数据以严格的方式解析;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。 (有关正确的JSON格式的更多信息,请参阅json.org。)

所以这一行会产生垃圾:

var json = eval('(' + data + ')');

(我在Chrome中遇到SyntaxError: Unexpected identifier错误

将其删除并使用data.message


除此之外,请勿使用eval来解析JSON数据there are better methods available

答案 1 :(得分:0)

此时你的json实际上被称为数据:

$('#TextHistory :last-child').after('<p>' + json.message +

这是由于:

function(data){

所以你应该像这样访问它:

$('#TextHistory :last-child').after('<p>' + data.message +