Javascript 为什么这个对象解析返回未定义?

Javascript 为什么这个对象解析返回未定义?,javascript,php,json,ajax,Javascript,Php,Json,Ajax,很抱歉,这是第n个版本的对象抓取,但我看不到它 我正在将一个JSON对象从db返回到Javascript,我在控制台中看到下面返回的对象非常好。但是,当我试图把一个孩子放进控制台的时候,我就没有定义。我应该能够看到result.bills或result[bills],只是为了确保我已经尝试了result[0].bills等,所有这些都是未定义的。这似乎很基本,但我不明白为什么我不能使这项工作 我的PHP在db之后的东西: if ($result) { $rows = array();

很抱歉,这是第n个版本的对象抓取,但我看不到它

我正在将一个JSON对象从db返回到Javascript,我在控制台中看到下面返回的对象非常好。但是,当我试图把一个孩子放进控制台的时候,我就没有定义。我应该能够看到result.bills或result[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"
    }
}

向ajax请求对象添加数据类型:


向ajax请求对象添加数据类型:

由于jQuery不知道它实际上正在接收返回的JSON,所以没有定义。如果您将JSON头与php文件一起发送,或者如果您将数据类型设置为“JSON”,则会检测并自动解析该文件

因此,当前您正在访问一个字符串:

var result = '{"bills":{"ID":"3","State":"MD","Title":"Maryland Android Project Act (S.1196 H.2057)","HouseNum":"H 2057","SenateNum":"","Session":"189th"}}'
但您正试图访问未定义的字符串函数

如果您选择不更改数据类型或添加标题,还可以执行result=JSON.parseresult,这也会给您同样的结果

执行上述三种解决方案之一将为您提供要查找的对象,并访问其子对象:

//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
因为jQuery不知道它实际上正在接收JSON返回,所以没有定义。如果您将JSON头与php文件一起发送,或者如果您将数据类型设置为“JSON”,则会检测并自动解析该文件

因此,当前您正在访问一个字符串:

var result = '{"bills":{"ID":"3","State":"MD","Title":"Maryland Android Project Act (S.1196 H.2057)","HouseNum":"H 2057","SenateNum":"","Session":"189th"}}'
但您正试图访问未定义的字符串函数

如果您选择不更改数据类型或添加标题,还可以执行result=JSON.parseresult,这也会给您同样的结果

执行上述三种解决方案之一将为您提供要查找的对象,并访问其子对象:

//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

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

//正确设置内容类型 标题'Content-Type:application/json'; 如果$result{ $rows=数组; 而$r=mysqli\u fetch\u assoc$result { $rows[]=$r;//注意如何将行附加到数组中 } http\u response\u code200;//PHP>=5.4 回声json_编码[ “成功”=>正确, “账单”=>美元行 ]; } 否则{ http\u response\u code500;//此处显示您的状态代码 回声json_编码[ “成功”=>错误, “消息”=>“出现了问题”, ]; } 以及您的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);
    }
});

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

//正确设置内容类型 标题'Content-Type:application/json'; 如果$result{ $rows=数组; 而$r=mysqli\u fetch\u assoc$result { $rows[]=$r;//注意如何将行附加到数组中 } http\u response\u code200;//PHP>=5.4 回声json_编码[ “成功”=>正确, “账单”=>美元行 ]; } 否则{ http\u response\u code500;//此处显示您的状态代码 回声json_编码[ “成功”=>错误, “消息”=>“出现了问题”, ]; } 以及您的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);
    }
});

首先,$rows[bills]至少会给您一个PHP警告,因为bills既不是变量也不是字符串。实际上,此语句正在重复将$r存储到同一数组元素中。您如何知道您正在取回{bills:{ID:3,State:MD,Title:Maryland Android Project Act S.1196 H.2057,HouseNum:h2057,SenateNum:,Session:189th}}?从“网络”选项卡还是通过console.log?@benjaminz:这是xhr日志。未定义的是控制台。为了澄清一点,xhr就是全部,但我正在尝试获取第一个子对象,为了清晰起见,我在php中将其命名为bills。@ColdSharper在执行console.logresult时得到了什么;在ajax调用之后,首先,$rows[bills]至少会得到一个PHP警告,因为bills既不是变量也不是字符串。实际上,此语句正在重复将$r存储到同一数组元素中。您如何知道您正在取回{bills:{ID:3,State:MD,Title:Maryland Android Project Act S.1196 H.2057,HouseNum:h2057,SenateNum:,Session:189th}}?从网络选项卡或仅通过控制台。日志?@be
njaminz:这是xhr日志。未定义的是控制台。为了澄清一点,xhr就是全部,但我正在尝试获取第一个子对象,为了清晰起见,我在php中将其命名为bills。@ColdSharper在执行console.logresult时得到了什么;在ajax电话之后?这很有帮助!我认为如果返回json,您不必显式地这样做。这很有帮助!我认为如果返回json,您不必显式地这样做。很好的解释。非常感谢。我知道,但我不知道。很好的解释。非常感谢。我知道,但我不知道。