【问题标题】:Can't get JSON to output无法让 JSON 输出
【发布时间】:2013-07-14 18:01:30
【问题描述】:

首先尝试使用 JSON。我有一个返回 JSON 对象的 ajax/php 函数。回到js端,我可以看到对象并将其输出到一个div。看起来不错。我可以将它打印到控制台,看起来仍然不错。但是当我尝试迭代它并公开各个值时,我只会在控制台中得到“未定义”。我无法弄清楚我错过了什么。对不起,如果是明显的东西,但我看不到。谢谢!

var jsonObj = JSON.parse(xmlhttp.responseText);
console.log(jsonObj);   //<--looks perfect
console.log(jsonObj.length);
document.getElementById("rightsidebox").innerHTML=response; //<--looks good
for (var group in jsonObj) {
    //each of these generates 'undefined' WHY???
    //I get 4 'undefined' outputs for each group, so I know that my loop is iterating correctly
    console.log(group.id);
    console.log(group.day);
    console.log(group.time);
    console.log(group.name);  
}

编辑:这是我的 ajax 调用返回的 JSON 对象之一的示例。在此示例中,我在数组中只有一个对象。当然,通常会有多个对象:

[{"id":"7","day":"Thursday","time":"7:00 a.m.","name":"Sub 10:00"}]

编辑 2:给定这个数组,我不得不问 JSON 的意义是什么。我可以返回这个数组,而无需 PHP 以 JSON 格式对其进行编码。那么,如果返回的只是一个 javascript 数组,那么我完成了什么?为什么不跳过 PHP 中的 JSON 编码然后遍历数组呢?显然这是有原因的,所以我显然遗漏了一些东西。有没有更好的方法来做我想要完成的事情?谢谢!

【问题讨论】:

  • console.log(jsonObj) 长什么样子?
  • 它看起来就像它应该的那样。我可以展开每个组并查看一组 4 个不同的键/值对。
  • ...如果你 console.log(group) 会发生什么?
  • console.log(JSON.stringify(jsonObj)) 会更好
  • 你确定你不是在迭代一个数组吗?那么group 将是一个索引。

标签: javascript json loops


【解决方案1】:

考虑以下几点:

var myJson = '{"groupA": {"id": 123, "name": "foo"}}';
var myObj = JSON.parse(myJson);
for (var i in myObj) {
    console.log(i);
    console.log(i.id);
    console.log(myObj[i].id);
}

这里的预期输出是:

myGroup
undefined
123

这是因为您循环只是将对象的“键”分配给值i。如果你要迭代一个 array,而不是一个对象,你会得到 indices 而不是字符串。

在您给出的示例 JSON 中,您有一个 数组,其中包含 一个对象。如果你打算在你的数组中有多个对象,这样的事情会更好:

for (var group in jsonObj) {
  var thisGroup = jsonObj[group];
  thisGroup.id; // Etc etc..
}

【讨论】:

  • 谢谢。然而,我认为这是不对的。是的,我的数组中有一个对象。但这就是for (var group in jsonObj) 循环的重点——迭代每个对象。在您建议的代码中,您循环遍历数组,然后遍历对象中的每个元素,然后引用对象内部的索引,然后引用索引内部的键???当我这样做时,我仍然得到“未定义”作为我的输出,只是这次我得到了很多。如果这是正确的,那么我根本看不到 JSON 的意义。它必须比这更简单。我错过了什么吗?再次感谢!
  • 谢谢!感谢您的跟进。
【解决方案2】:

如果你有正确的 jsonObj,并且你说你有,你可以使用格式化以易于阅读的形式输出对象。您不必遍历它。

console.log(JSON.stringify(jsonObj, null, 1));

【讨论】:

  • 谢谢。但这有什么作用呢?如我所见,此函数将 JSON 对象转换为字符串。我为什么要这样做?那如何让我不必循环遍历它?
【解决方案3】:

当我原来的 for (var group in jsonObj) 循环不起作用时,不知道为什么会这样,但无论如何......

for (var i=0; i < jsonObj.length; i++) {
    console.log(jsonObj[i].id);
    console.log(jsonObj[i].day);
    console.log(jsonObj[i].time);
    console.log(jsonObj[i].name);
}

【讨论】:

  • -1?为什么?无法忍受这些不加解释的直接投票。
  • -1,因为您只有一个包含一个元素的数组。循环没有意义,你可以使用jsonObj[0]。
  • 仅在本例中。我试图保持简单。正如我上面解释的,在现场情况下,我有多个对象。
  • 我保留我的反对意见,因为您的帖子更像是一个问题而不是一个答案。你找到了让它工作的原因,但说你不知道为什么。顺便说一句,原因是你有一个数组,而 for...in 循环不擅长遍历数组。它们循环遍历keys 而不是values,因此您仍然需要执行jsonObj[group] 才能访问该值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2018-11-05
相关资源
最近更新 更多