循环通过复杂的JSON对象

Loop through complex JSON object

本文关键字:JSON 对象 复杂 循环      更新时间:2023-09-26

我有一个非常复杂的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"
        }
      }
    ]
   }
  ]
}
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 = 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上演示。

不能说这是唯一的问题,但countries数组后面缺少一个逗号。

此外,对于像"类别"(和其他(这样的分段,你确定它需要用方括号包裹吗?在JS中,这是一个数组。所以我相信你是说你有一个数组,但在这种情况下,这个数组的唯一成员是一个对象。

因为您的问题有一个jquery标签:

我个人将jquery.dump插件用于此类目的。