Javascript 为什么这个对象解析返回未定义?
很抱歉,这是第n个版本的对象抓取,但我看不到它 我正在将一个JSON对象从db返回到Javascript,我在控制台中看到下面返回的对象非常好。但是,当我试图把一个孩子放进控制台的时候,我就没有定义。我应该能够看到result.bills或result[bills],只是为了确保我已经尝试了result[0].bills等,所有这些都是未定义的。这似乎很基本,但我不明白为什么我不能使这项工作 我的PHP在db之后的东西: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();
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,您不必显式地这样做。很好的解释。非常感谢。我知道,但我不知道。很好的解释。非常感谢。我知道,但我不知道。