为什么这个对象解析返回undefined?

时间:2015-12-07 20:59:07

标签: javascript php json ajax

很抱歉第n个版本的对象抓取,但我只是没有看到它。

我正在从数据库返回一个JSON对象到我的Javascript,我在控制台中看到返回的对象(如下)。但是当我试图让孩子进入控制台时,我得到了"undefined"。我应该能够看到result.billsresult["bills"]并确保我已经尝试了result[0].bills等等,所有这些都是未定义的。这看起来很基本,但我不明白为什么我不能做这项工作。

我的PHP(在db之后):

if ($result) { 
    $rows = array();
    while($r = mysqli_fetch_assoc($result)) {
        $rows[bills] = $r;
    }  
    echo json_encode($rows);
} else {
    echo "Unknown Error";   
}
//all done

我的AJAX:

$.ajax({
    type: 'get',
    url: 'GetBills.php',
    success: function(result) {
        var thebills = result.bills;
        console.log(thebills);          
    },
    error: function(xhr, desc, err) {
        console.log(xhr);
        console.log("Details: " + desc + "\nError:" + err);
    }
});

我回来了:

{
    "bills": {
        "ID": "3",
        "State": "MD",
        "Title": "Maryland Android Project Act (S.1196 H.2057)",
        "HouseNum": "H 2057",
        "SenateNum": "",
        "Session": "189th"
    }
}

3 个答案:

答案 0 :(得分:5)

你得到undefined因为jQuery不知道它实际上正在接收JSON。如果您使用php文件发送JSON 标题,或者将dataType设置为'json',则会检测到自动解析

所以,目前你正在访问一个字符串:

var result = '{"bills":{"ID":"3","State":"MD","Title":"Maryland Android Project Act (S.1196 H.2057)","HouseNum":"H 2057","SenateNum":"","Session":"189th"}}'

但您正在尝试访问STRING函数(特别是billsundefined)。

如果您选择不更改dataType或添加标题,您也可以执行result = JSON.parse(result),这也会给您带来同样的效果。

执行上述三个解决方案之一将为您提供您正在寻找的对象,并访问其子女:

//Javascript
result = JSON.parse(result);

//In Console
Object {bills: Object}
bills: 
   ObjectHouseNum: "H 2057"
   ID: "3"
   SenateNum: ""
   Session: "189th"
   State: "MD"
   Title: "Maryland Android Project Act (S.1196 H.2057)"
__proto__: Object
__proto__: Object

答案 1 :(得分:3)

将dataType添加到您的ajax请求对象: ...

type: 'get',
url: 'GetBills.php',
dataType: 'json',

...

答案 2 :(得分:1)

您可以在AJAX调用中强制内容类型为JSON,甚至更好,在PHP中设置正确的内容类型,让jQuery自动检测它。想象一下从不同于jQuery的其他工具访问您的数据,例如移动应用程序或一些REST工具。如果您正确设置了内容类型,大多数工具/语言都会自动检测它,您不必一次又一次地手动解析它。

// Set the content type correctly
header('Content-Type: application/json');

if ($result) {
    $rows = array();

    while ($r = mysqli_fetch_assoc($result))
    {
        $rows[] = $r; // Notice how to append the row to the array
    }

    http_response_code(200); // PHP >= 5.4
    echo json_encode([
        'success' => true,
        'bills' => $rows
    ]); 
}
else {
    http_response_code(500); // Your status code here
    echo json_encode([
        'success' => false,
        'message' => 'Something went wrong',
    ]);
}

你的JavaScript:

$.ajax({
    type: 'get',
    url: 'GetBills.php',
    success: function(result) {
        var thebills = result.bills;
        console.log(thebills);
    },
    error: function(response) {
        console.log('Error', response.message);
    }
});