在使用AJAX从php文件传递JSON字符串之后,如何在Javascript中将JSON字符串解析为多维数组?
在我运行一个完整的程序之前,我正在做一些测试,这是件好事。我一直在做一些测试,将多维数组从php文件返回到htm网页。为了将问题缩小到JSON.parse(),我已经测试了很多东西。以下是我在response.PHP文件中的PHP代码:在使用AJAX从php文件传递JSON字符串之后,如何在Javascript中将JSON字符串解析为多维数组?,javascript,ajax,json,parsing,multidimensional-array,Javascript,Ajax,Json,Parsing,Multidimensional Array,在我运行一个完整的程序之前,我正在做一些测试,这是件好事。我一直在做一些测试,将多维数组从php文件返回到htm网页。为了将问题缩小到JSON.parse(),我已经测试了很多东西。以下是我在response.PHP文件中的PHP代码: <html> <head> </head> <body> <?php $test = array( array("first" => "Aaron", "last" => "Rodgers"),
<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>
然后在我的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>
但不管格式如何,我都得不到输出(至少是可见的)。让我困惑的是,即使我的array.length也不会显示值。我没有收到错误消息,只是一个空白输出。提前感谢大家的指点或修正
编辑:在将我的外部数组作为对象进行类型转换后,我仍然只能得到空白输出。不过,我确实认为在我的情况下,类型转换是必要的。在PHP文件中,删除HTML标记。这将解决问题。否则,当从.htm文件调用responseText时,字符串将包含HTML标记,并且在使用JSON.parse()解析数据时会导致语法错误。这不是对您问题的回答-您已经解决了问题。但我想跟进一些评论,答案是正确设置代码格式的唯一方法 @hyphenbash提出了一个很好的建议:将数组封装在一个对象中,用于JSON输出,而不是输出裸数组。虽然JSON确实允许在顶层使用数组(与评论中说这将是无效的JSON相反),但使用对象并将数组作为属性放在对象中有很多好处 考虑原始JSON的数组版本(在添加
(对象)
cast之前)。看起来是这样的(为了可读性,设置了一些格式):
这并没有错,但假设您想向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;
- 去掉
周围的引号-这两种方法都可以,但通常使用数组的数字索引0
- 访问对象属性时,请使用
符号,而不是.foo
。这两种方法中的任何一种在这里也适用,但是[“foo”]
是一种习惯,而且更简洁.foo
在PHP和JavaScript之间切换有些混乱,因为JavaScript有单独的数组和对象概念,PHP将两者结合在一起。您可能会发现此链接很有用:此代码似乎没有我遇到的问题。我没有收到任何错误消息。当我使用AJAX检索JSON.parse()时,我只会得到无法查看的输出。这是否意味着我应该使用JSON_encode($test,JSON_force_object)将其强制作为一个对象;在我的php文件中?否则我将如何将输出更改为JSON格式?我认为使用json_encode()是所有必要的。
{
status: "test",
data: [
{ "first":"Aaron", "last":"Rodgers" },
{ "first":"Willie", "last":"Makit" }
]
}
<?php
$test = array(
"status" => "test",
"data" => array(
array("first" => "Aaron", "last" => "Rodgers"),
array("first" => "Willie", "last" => "Makit")
)
);
echo json_encode($test);
?>
var test1 = JSON.parse(testAjax.responseText);
document.getElementById("doIt").innerHTML = test1.data[0].first;