在运行全规模程序之前,我正在进行一些测试,这是件好事。我一直在进行一些测试以将一个多维数组从我的php文件返回到我的htm网页。我已经测试了很多东西来将我的问题缩小到JSON.parse((
<html>
<head>
</head>
<body>
<?php
$test = array(
array("first" => "Aaron", "last" => "Rodgers"),
array("first" => "Willie", "last" => "Makit")
);
//header('Content-Type: application/json');
echo json_encode($test);
?>
</body>
</html>
我的输出正常:
{"0":{"first":"Aaron","last":"Rodgers"},"1":{"first":"Willie","last":"Makit"}} //New output as per object typecasting
然后,在我的htm文件中,我只是试图在按下按钮后将名字"Aaron"显示为输出。这是我的html和javascript的代码:
<html>
<head>
<script type="text/javascript" language="javascript">
function ajaxTest(){
var testAjax = new XMLHttpRequest();
testAjax.onreadystatechange = function(){
if(testAjax.readyState==4)
{
var test1 = JSON.parse(testAjax.responseText);
document.getElementById("doIt").innerHTML = test1.row[0].first; //I believe my error might be an issue with my formatting on this line
}
}
testAjax.open("GET", "response.php", true);
testAjax.send(null);
}
</script>
</head>
<body>
<input type="button" value="try it" onclick="ajaxTest()"/>
<div id="doIt"></div>
</body>
</html>
我已经尝试过显示原始json字符串,这很有效。但一旦我使用JSON.parse((,我试图显示的任何数据都是空白的。我已经尝试了几种格式,包括以下格式:
document.getElementById("doIt").innerHTML = test[0][1];
... = test[0].first;
... = test;
... = test.length;
但不管格式如何,我都不会得到任何输出(至少是可见的(。令我困惑的是,即使是我的array.length也不会显示值。我没有收到错误消息,只有一个空白输出。提前感谢所有人的建议或修复。
edit:在将外部数组类型转换为对象后,我仍然只能得到空白输出。然而,我确实认为打字对我来说是必要的。
在PHP文件中,删除HTML标记。这将解决问题。否则,当从.htm文件调用responseText时,该字符串将包括HTML标记,并在使用JSON.parse((解析数据时导致语法错误。
这不是你问题的答案-你已经解决了问题。但我想跟进几条评论,答案是正确设置代码格式的唯一方法。
@连字符bash提出了一个很好的建议:将数组封装在JSON输出的对象中,而不是输出裸数组。虽然JSON确实允许在顶级使用数组(与评论中说这将是无效的JSON相反(,但使用对象并将数组作为属性放入对象中有好处。
考虑原始JSON的数组版本(在添加(object)
强制转换之前(。它看起来是这样的(为了可读性,有一些格式(:
[
{ "first":"Aaron", "last":"Rodgers" },
{ "first":"Willie", "last":"Makit" }
]
这并没有错,但假设您想向JSON响应中添加一些其他内容,这些内容不是数组的部分,可能是某种状态或错误指示。没有地方放它!
相反,假设您将数组封装在一个对象中:
{
data: [
{ "first":"Aaron", "last":"Rodgers" },
{ "first":"Willie", "last":"Makit" }
]
}
现在,如果你想添加一些其他信息,这很容易:
{
status: "test",
data: [
{ "first":"Aaron", "last":"Rodgers" },
{ "first":"Willie", "last":"Makit" }
]
}
生成此代码的PHP代码与原来的相比是一个简单的更改
<?php
$test = array(
"status" => "test",
"data" => array(
array("first" => "Aaron", "last" => "Rodgers"),
array("first" => "Willie", "last" => "Makit")
)
);
echo json_encode($test);
?>
在JavaScript代码中处理这个问题同样容易:
var test1 = JSON.parse(testAjax.responseText);
document.getElementById("doIt").innerHTML = test1.data[0].first;
请注意,我在JavaScript代码中建议的其他一些小更改:
去掉
0
周围的引号-两者都可以,但通常使用带数组的数字索引。访问对象属性时,请使用
.foo
表示法而不是["foo"]
。两者中的任何一种也适用于此,但.foo
是习惯的,更简洁。
在PHP和JavaScript之间切换有点令人困惑,因为JavaScript有单独的数组和对象概念,PHP将它们合并为一个。