在使用AJAX从php文件传递JSON字符串之后,如何在Javascript中将JSON字符串解析为多维数组?

在使用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"),

在我运行一个完整的程序之前,我正在做一些测试,这是件好事。我一直在做一些测试,将多维数组从php文件返回到htm网页。为了将问题缩小到JSON.parse(),我已经测试了很多东西。以下是我在response.PHP文件中的PHP代码:

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