遍历复杂的 JSON 对象

3
我有一个非常复杂的JSON对象,需要将所有属性和键按原样输出。我已经理解了这个概念,但无法实现。
如果对象中包含对象,则需要不断调用该函数。但是我遇到了一些问题:有些键没有被输出,有些值被分割了。
0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc....
name:Travel
scheme:
label:

我猜测我的代码中可能有一些小错误需要更改。
ObjectValues = function(obj){
for(var j in obj){
   if(typeof(obj[j]) == "object"){
       for(var k in obj[j]){
         ObjectValues(obj[j][k]);
       }
   } else {
       console.log(j + ":" + obj[j]);
   }
}

_

{
"title": "Norway Tourism: Wildlife and Nature",
"author": "",
"categories": [
    {
        "name": "Travel",
        "scheme": "",
        "label": ""
    }
],
"countries": [

],
"content": [
    {
    "thumbnails": [
    {
        "audioChannels": 0,
        "audioSampleRate": 0,
        "bitrate": 0,
        "checksums": {
            "md5": "7089E4E044069AE7702DEC686"
        }
      }
    ]
   }
  ]
}
4个回答

8
ObjectValues = function(v, k){
  if (typeof v == "object") {
    for (var kp in v) {
      if (Object.hasOwnProperty.call(v, kp)) {
        ObjectValues(v[kp], k != undefined ? k + "." + kp : kp);
      }
    }
  } else {
    console.log(k + ":" + v);
  }
};

应该适用于不是对象的JSON值。它将适用于

ObjectValues(JSON.parse("0"));

如果您执行ObjectValues("http://..."),原始代码将无法处理此类内容,并且不会迭代顶级字符串中的字符。

无法打印例如 ObjectValues( { x:{y:"1"} } ) 中的键“x”。 - Frunsi
@frunsi,真的吗?对我来说是有效的。你在哪个浏览器上进行测试? - Mike Samuel
@frunsi,我想问题已经解决了。但我仍不确定具体要求是什么。 - Mike Samuel
这很好用,但我需要稍微修改一下,以便在输入另一个对象时不返回0。除此之外,非常感谢!:D - Bankzilla
@Bankzilla,0的出现是由于数组边界引起的。您可以进行一些调整以忽略长度为1的数组。 - Mike Samuel
显示剩余3条评论

2

使用:

ObjectValues = function(obj) {
    var isArray = obj instanceof Array;
    for (var j in obj) {
        if (obj.hasOwnProperty(j)) {
            if (typeof(obj[j]) == "object") {
                if(!isArray)
                {
                    console.log(j + ":");
                }
                ObjectValues(obj[j]);
            } else if(!isArray) {
                console.log(j + ":" + obj[j]);
            }
        }
    }
}

注意已删除的循环。按照您之前的分割方式,您会丢失 k 名称。
您还应该使用 hasOwnProperty 来避免序列化不需要的键。
如果值是对象,则仍要序列化键(例如,您不希望 {foo: {} } 的 foo 被丢失)。
最后,我必须进行数组检查,因为数组也是对象,我们确实希望在数组内嵌套输出键,但不想输出数组索引本身。
演示请参见 jsFiddle

这对于像 OP 中的 ObjectValues("http://...") 这样的情况仍然会失败,因为它返回的是 0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc.... - Mike Samuel
这基本上是准确的:D唯一的问题是类别仍然像示例中返回,即名称:旅行计划:标签:而不是类别:名称:旅行计划:标签: - Bankzilla

0

不能说这是唯一的问题,但你在 countries 数组后面漏了一个逗号。

另外,对于像“categories”(和其他类似的)这样的段落,你确定它需要用方括号括起来吗?在 JS 术语中,那是一个数组。因此我认为你是在说你有一个数组,但在这种情况下,该数组的唯一成员是一个对象。


这些只是一个更大的JSON文件的片段。很抱歉我无法控制它的返回方式,如果我能的话,它看起来不会像这样:D - Bankzilla
好的。它仍然会返回对象类型,但你必须确保从那里正确地钻取进去。然而,缺少逗号是一个问题,因为它会创建无效的JSON。 - Greg Pettit

0

鉴于您的问题中有一个 jquery 标签:

我个人使用 jquery.dump 插件来实现这样的目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接