从 Jquery JSON 获取响应


Getting Response From Jquery JSON

我无法从我的php jquery/json/ajax获得响应。我一直将所有这些不同的教程组合在一起,但我似乎仍然无法将它们放在一起,因为没有一个教程遵循我想要做的事情。

现在我正在尝试将两个数组(因为没有简单的方法可以将关联数组传递给我的jquery ajax函数并发出警报。这是我的代码:

.PHP

$names = array('john doe', 'jane doe');
$ids = array('123', '223');
$data['names'] = $names;
$data['ids'] = $ids;
echo json_encode($data);

Jquery

function getList(){
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        complete: function(data){ 
            var test = jQuery.parseJSON(data);
            alert(test.names[0]);
            alert("here");
        }
    },
        "json");
}
getList();

在我的 html 文件中,我真正调用的只是用于调试目的的 javascript 文件。我知道我正在返回一个对象,但我的名字部分出现空值错误,我不确定为什么。我错过了什么?

我的 PHP 文件返回

{"names":["john doe","jane doe"],"ids":["123","223"]}

似乎就到此为止了 Uncaught TypeError: Cannot read property '0' of undefined 所以我的sub0正在杀死我。

你可以

使用 jQuery 提供的 $.getJSON 门面,这将为标准 JSON 请求设置所有必需的 ajax 参数:

$.getJSON('test.php', function(response) {
    alert(response.names[0]);   // john doe
}); 

但是,我认为问题的途径是 1) 您的服务器可能没有返回正确的响应代码和/或正确的标头(即:JSON 数据) - 但是上述方法至少对于后者应该强制得出这个结论。

请参阅:http://api.jquery.com/jQuery.getJSON

看起来问题是你使用的是完整的回调而不是成功回调:

function getList(){
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        success: function(data) { /* success callback */
            var test = jQuery.parseJSON(data);
            alert(test.names[0]);
            alert("here");
        }
    },
    "json");
}
getList();

来自jQuery AJAX Docs:

success(data, textStatus, jqXHR)

请求成功时要调用的函数。该函数传递三个参数:从服务器返回的数据,根据 dataType 参数进行格式化;描述状态的字符串;和 jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象。从jQuery 1.5开始,成功设置可以接受一系列函数。将依次调用每个函数。这是一个阿贾克斯事件。

complete(jqXHR, textStatus)

请求完成时(执行成功和错误回调后)要调用的函数。该函数传递两个参数:jqXHR(在jQuery 1.4.x中,XMLHTTPRequest)对象和一个对请求状态进行分类的字符串("成功","未修改","错误","超时","中止"或"解析器错误")。从jQuery 1.5开始,完整的设置可以接受一系列函数。将依次调用每个函数。这是一个阿贾克斯事件。

jQuery想知道什么样的数据作为响应,否则它就不知道如何解析它。

所以,正如之前所说,你使用 dataType = 'json' 属性告诉 jQuery。

function getList() {
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        dataType: "json",
        success: function(data) { 
            console.log(data);
        }
    });
}

最重要的是,让 PHP 将其内容呈现为 json 而不是 html 是个好主意。您可以通过在 PHP 脚本中的任何输出之前设置 header('Content-type: application/json'); 来使用此标头。所以:

$names = array('john doe', 'jane doe');
$ids = array('123', '223');
$data['names'] = $names;
$data['ids'] = $ids;
header('Content-type: application/json');
echo json_encode($data);

你应该在单个对象中传递 ajax() 函数的所有参数。因此,应该有"数据类型"选项。此外,如果您显式设置数据类型,jQuery 将为您解析 JSON 数据。完整的回调将接收解析的 JavaScript 对象作为参数。

function getList() {
    $.ajax({  
        type: "GET", 
        url: 'test.php', 
        data: "",  
        dataType: "json",
        success: function(test) { 
            alert(test.names[0]);
            alert("here");
        }
    });
}