Печать вложенного JSON без использования имен переменных - PullRequest
5 голосов
/ 05 ноября 2010

веб-служба возвращает следующий вложенный объект json:

{"age":"21-24","gender":"Male","location":"San Francisco, CA","influencer score":"70-79","interests":{"Entertainment":{"Celebrities":{"Megan Fox":{},"Michael Jackson":{}},},"Social Networks & Online Communities":{"Web Personalization": {},"Journals & Personal Sites": {},},"Sports":{"Basketball":{}},},"education":"Completed Graduate School","occupation":"Professional/Technical","children":"No","household_income":"75k-100k","marital_status":"Single","home_owner_status":"Rent"}

Я просто хочу перебрать этот объект без указания имени свойства, я попробовал следующий код:

for (var data in json_data) {
    alert("Key:" + data + " Values:" + json_data[data]);
}

однако он печатает значение как [объектный объект], если это вложенное значение, есть ли способ продолжить итерацию глубже во вложенные значения?

Ответы [ 6 ]

7 голосов
/ 06 ноября 2010

Попробуйте это:

function iter(obj) {
  for (var key in obj) {
    if (typeof(obj[key]) == 'object') {
      iter(obj[key]);
    } else {
      alert("Key: " + key + " Values: " + obj[key]);
    }
  }
}

BB: добавлено + для предотвращения ошибки.

3 голосов
/ 06 ноября 2010

Вы можете сделать это рекурсивно.

function alertobjectKeys(data) {
  for (var key in data) {
    if (typeof(data[key]) == "object" && data[key] != null) {
      alertobjectKeys(data[key]);
    } else {
      alert("Key:" + key + " Values:" + data[key]);
    }
  }
}
0 голосов
/ 18 апреля 2011

Я предполагаю, что в вашем запросе (при условии, что это Ajax) вы не указываете тип данных, который будет возвращен как 'json'.

0 голосов
/ 06 ноября 2010
function recursiveParse(variable) { 
    for (var key in variable) {
        if ((is_object(variable[key])) || (is_array(variable[key]))) {
            recursiveParse(variable[key]);
        } else {
            // Process variable here
        }
    }
}

Затем просто вызовите эту функцию с параметром, являющимся данными json, она рекурсивно проанализирует оставшиеся объекты и массивы.

0 голосов
/ 06 ноября 2010

Это, конечно, требует рекурсии

(function(obj) {
  for (var key in obj) if (obj.hasOwnProperty(key)) {
    if (typeof obj[key] == 'object' && obj[key] !== null)
      arguments.callee(obj[key]);
    else 
      alert("Key: " + key + " Values: " + obj[key]);
  }
)(json_data));
0 голосов
/ 06 ноября 2010

Вы всегда можете создать рекурсивную функцию:

function alertObj(obj) {
    for (var data in obj) {
        if(typeof(obj[data]) === "object")
            alertObj(obj[data]);
        else
            alert("Key:" + data + " Values:" + obj[data]);
    }
}

Пока вы не беспокоитесь о рекурсии (что вам, вероятно, не нужно для объектов JSON).

Вы также можете сделать это с помощью структуры очереди или стека (массива):

function alertObj_queue(obj) { // Breadth-first
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object

    for(var i = 0; i < arrPrint.length; i++) {
        if(typeof(arrPrint[i].data) === "object") {
            for(var k in arrPrint[i].data) { // Add each to end of array
                arrPrint.push({key: k, data: arrPrint[i].data[k]});
            }
            alert("Object key: " + arrPrint[i].key);
        } else {
            alert("Key:" + arrPrint[i].key + " Values:" + arrPrint[i].data);
        }
    }
}

function alertObj_stack(obj) { // Depth-first
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object

    while(arrPrint.length) {
        var o = arrPrint.pop();
        if(typeof(o.data) === "object") {
            for(var k in o.data) { // Add each to end of array
                arrPrint.push({key: k, data: o.data[k]});
            }
            alert("Object key: " + o.key);
        } else {
            alert("Key:" + o.key + " Values:" + o.data);
        }       
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...