2011-01-08 27 views
5

Actualmente estoy tratando de averiguar cómo puedo iterar sobre todos los objetos en una respuesta JSON. Mi objeto puede tener sub objetos infinitos y también pueden tener sub objetos infinitos.jQuery e iteración en objetos JSON

{ 
    "obj1" : { 
     "obj1.1" : "test", 
     "obj1.2" : { 
     "obj1.1.1" : true, 
     "obj1.1.2" : "test2", 
     "obj1.1.3" : { 
      ... // etc 
     } 
     } 
    } 
} 

Me preguntaba si existe un script de fábrica que pueda manejar este tipo de objetos.

+0

+1 para el nombre y la pregunta interesante. No creo que necesariamente utilice el tipo de estructura de datos que está utilizando, parece que podría ser costoso en ambos extremos. Probablemente sean soluciones mucho mejores que no requieren caminar por el árbol. Tal vez puedas dar más detalles sobre lo que intentas hacer con los datos (cuando encuentres los bits interesantes). – Gabriel

+0

En general, es mejor conocer el formato general de la respuesta. El poder de JSON radica en la capacidad de obtener objetos por clave. Si ahora tiene idea de cuáles son las claves o valores, y cuál es el formato, entonces JSON probablemente no sea para usted. – Alex

+0

No utilice [firmas ni eslóganes] (http://stackoverflow.com/faq#signatures) en sus publicaciones. – meagar

Respuesta

4

He aquí una pequeña función que realiza el seguimiento de la profundidad de su paseo por el árbol, con paradas en el camino para permitir que hagas realizar una acción (que no especifica lo que realmente quiere hacer, o cuando):

function dig(blob, depth) { 
    var depth = depth || 0; // start at level zero 
    for(var item in blob) { 
    console.log('depth: ' + depth + ': ' + item); // do something real here 
    if(typeof blob[item] === 'object') { 
     dig(blob[item], ++depth); // descend 
    } else { // simple value, leaf 
     console.log(' => ' + blob[item]); // do something real here 
    } 
    } 
}  

console.log(dig(obj)); 

Suponiendo obj es su JSON que el anterior, esto debe darle algo similar (no probado):

depth: 0: obj1 
depth: 1: obj1.1 
=> test 
depth: 1: obj1.2 
// etc. 
+0

¡Esto hará el trabajo que necesito! ¡Gracias! – tftd

1

Una vez que haya analizado sintácticamente el JSON en un objeto, se tendrá que aplicar un árbol-Walker (una función recursiva) para encontrar valores particulares que le interesan.

Sin embargo, JOrder probablemente le ayudará una gran oferta, proporciona servicios de gestión de datos, esto le ahorra al escribir un tree-walker. y hace una buena búsqueda y clasificación de rendimiento.

https://github.com/danstocker/jorder

0

La biblioteca jQuery JavaScirpt tiene simplemente el método:

var jsonObject = $.parseJSON('{ 
    "obj1" : { 
     "obj1.1" : "test", 
     "obj1.2" : { 
     "obj1.1.1" : true, 
     "obj1.1.2" : "test2", 
     "obj1.1.3" : { 
      ... // etc 
     } 
     } 
    } 
}'); 

alert(jsonObject['obj1']); 

El parseJSON() method acepta una cadena JSON (que es lo que se obtiene de una solicitud JSON) y devuelve un objeto de JavaScript. Desde allí puede acceder a los datos como lo haría normalmente con cualquier objeto de JavaScript.

+0

Oh, supuse que el Diablo sabe cómo hacer del JSON un Objeto. – ocodo

+0

@Slomojo Ah sí, creo que me perdí el sentido de la pregunta. –

+0

@Marus, ¡Tal vez no! Iterar, originalmente se deletreaba "irritante" – ocodo

2

Lo que has representado en tu pregunta no es JSON, es un objeto literal de JavaScript. La diferencia es que uno es una cadena, y uno es un objeto literal real que se puede usar en JavaScript sin más conversiones.

Para caminar un objeto literal de JS, utilice un bucle recursivo simple para. No necesita una biblioteca separada para eso.

var walk = function(o){ 
    for(var prop in o){ 
    if(o.hasOwnProperty(prop)){ 
     var val = o[prop]; 
     console.log('Value = ',val, ', Prop =', prop, ', Owner=',o); 
     if(typeof val == 'object'){ 
     walk(val); 
     } 
    } 
    } 
}; 

walk({ 'foo':'bar', biz: { x: 'y' } }); 
+0

¡este es un gran ejemplo! – Mrchief

0

estoy usando este fragmento de código que caminar a través de json. Básicamente, cuando el nodo es un objeto, llamo a la misma función recursivamente. Esperamos que te sea útil.

Necesita, como puede ver, jQuery. También se puede hacer sin usar la misma idea.

function recorrer(json) {

$.each(json, function(index, value) { 


     switch ($.type(value)){ 

      case 'string': 
        console.log(value) //for example      
       break; 

      case 'object': 
       recorrer(value); // recursiva      
       break; 
     } 



}); 

};