Цикл по сложному объекту JSON - PullRequest
3 голосов
/ 10 октября 2011

У меня есть один чрезвычайно сложный объект 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 ]

7 голосов
/ 10 октября 2011
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://...").

2 голосов
/ 10 октября 2011

Использование:

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 .

0 голосов
/ 10 октября 2011

Поскольку в вашем вопросе есть тег jquery:

Я лично использую плагин jquery.dump для таких целей.

0 голосов
/ 10 октября 2011

Не могу сказать, что это единственная проблема, но вы пропустили запятую после массива стран.

Кроме того, для таких сегментов, как «категории» (и другие), вы уверены, что они должны быть заключены в квадратные скобки? С точки зрения JS это массив. Поэтому я считаю, что вы говорите, что у вас есть массив, но в этом случае единственный член этого массива - это объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...