【问题标题】:How do I access a JSON array in JavaScript如何在 JavaScript 中访问 JSON 数组
【发布时间】:2020-12-26 04:21:54
【问题描述】:

我有一个 PHP 脚本,我向其发出 Ajax 请求,大部分都可以正常工作,但我无法访问返回给 JavaScript 函数的数据中的数组。

所以,PHP 有一堆常规变量和一个数组。数组 $places 有四个元素,每个元素都有三个值,如下所示:

[["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]

PHP 脚本的相关摘录是:

$encoded_places = json_encode($places);  // if I don't do this then I end up with a value of "Array"
$qobject->name = "$name";
$qobject->multi = "$multi";
$qobject->places= "$encoded_places";

$myJSON = json_encode($qobject);
echo $myJSON;

在 JavaScript 脚本中(使用 JQuery),我成功地从 Ajax 请求中获取数据,并且可以访问所有数据,除了 $places 数据。

 $.getJSON(url, function(data, status){

   var stringified = JSON.stringify(data);
   var parsedObj = JSON.parse(stringified);

   var x = parsedObj.name; // alert(x);  // which works fine

   var myArray = new Array();
   myArray.push(parsedObj.places);

   for(var i = 0; i < myArray.length; i++){
        console.log(myArray[i]);
   }

...控制台将显示我所期望的,即:

[["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]

但是,我在访问这些值时遇到了困难。例如,假设我尝试访问第一个元素的“815”部分,例如:myArray[0][1],我最终得到的是“[”。

我猜这整段数据只是一个字符串,而不是一个数组,但我对 JavaScript 不够熟悉,不知道如何进行。

例如,如果我在 JavaScript 脚本中执行此操作(希望在警报中看到 815、2813、1582 和 1220),我将看到的只是带有“[”的单个警报。 (即它只循环一次,并选择位置 1 的字符)。

for(var i = 0; i < myArray.length; i++){
    console.log(myArray[i]);
    alert(myArray[i][1]);                                                                                                             
}

非常感谢有人解释: (a) 如何访问 JS 中的各个元素和值 (b) 我如何遍历它们,虽然大概一旦它是一个数组而不是一个字符串,那么上面的代码应该这样做。

非常感谢您的帮助。

现已解决: 正如@charlietfl 所指出的,在下面使用引号

$qobject->places= "$encoded_places";

把事情搞砸了,同时在 $places 上使用了 json_encode。但是,如果不删除引号,这两种方式都不起作用。所以,去掉引号,最后只在整个结构上使用 json_encode,现在可以正常工作了。

所以,上面给出的原始 sn-p 代码现在看起来像:

$qobject->name = $name;
$qobject->multi = $multi;
$qobject->places= $places;

$myJSON = json_encode($qobject);
echo $myJSON;

【问题讨论】:

  • console.log(typeof parsedObj.places) 给你什么?此外,您不需要创建新的Array,因为它似乎已经是一个数组,而myArray.push 只会将整个数组推入新Array 的第一个位置,不确定这是否是您的想要。
  • 不要对 $places 进行 json_encode。让$myJSON = json_encode($qobject); 做所有的序列化。解析时得到的是嵌套的 json 字符串,而不是你认为得到的数组
  • console.log(typeof parsedObj.places); // 字符串
  • 那么你应该做var myArray = JSON.parse(parsedObj.places) - 最终问题与@charlietfl 提到的有关
  • @goto1 内部使用$.getJSON进行解析

标签: javascript php arrays json ajax


【解决方案1】:

改变

$qobject->places = "$encoded_places";

$qobject->places = $places;

并摆脱$encoded_places = json_encode($places);,以便对 json_encode 的一次调用序列化整个结构

【讨论】:

  • 谢谢,但如果我去掉 $encoded_places 位,只调用一次 json_encode 来序列化整个结构,那么我的情况似乎更糟,因为与其在所有,console.log(myArray[i]) 只给出“Array”(而不是值的字符串),console.log(typeof parsedObj.places) 仍然给出“String”。
  • print_r($places) 看起来像什么?你有没有引用"$places",因为那是不正确的
  • 带引号的好电话!是的,事情就是这样。在不修改任何其他内容的情况下,我可以通过从“$encoded_places”中删除引号来使其工作。真的非常感谢!!!不确定我如何/是否可以接受您的评论作为答案,但我非常感激。谢谢你。稍后再回来查看是否有任何其他 cmets。
  • 仍然不需要encoded_places,应该只能json_encode一次
  • 真;我看到我在测试引号时使用了 $places,而不是 $encoded_places,所以是的,我想这是我改变的第二件事;所以,没有引号,只有一个 json_encode 输出前。再次感谢您。
【解决方案2】:

试试这个:

$.getJSON(url, function(data, status){
  var parsedObj = JSON.parse(stringified);

  console.table(parsedObj.places);
  console.log(parsedObj.places)[0][0];
}

在发布代码的getJSON 上下文中,data 已经是一个 JSON 字符串。所以这一行是多余的字符串化你的 JSON 字符串:

var stringified = JSON.stringify(data);

stringified 现在设置为来自data 参数的有效 JSON 字符串的文字/转义版本:

  [[\"z\",\"815\",\"1\"],[\"w\",\"2813\",\"0\"],[\"s\",\"1582\",\"2\"],[\"b\",\"1220\",\"5\"]]

当将该双字符串化值传递给 JSON.parse 以获取 parsedObj 引用时,它再次变为原始 JSON 字符串(在警告框中看起来很正确)。

字符串在 JavaScript 中是可迭代的,所以 for 循环只是遍历字符串。

【讨论】:

  • 这对我来说有点道理,尤其是偷偷摸摸的字符串迭代,但它对我不起作用,因为“Uncaught SyntaxError: Unexpected token o in JSON at position 1” ...这提醒我是如何最终完成对 JSON.stringify(data) / JSON.parse(stringified) 所做的事情的,这里给出了该错误的修复:thisinterestsme.com/fix-unexpected-token-o-in-json
  • 哦,我明白了。在这种情况下,一个快速的解决办法是保留原来的stringify 和两次使用parse。但更好的解决方法是确保 PHP 首先返回格式正确的 JSON 字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
相关资源
最近更新 更多