2011-01-08 16 views
5

Ich versuche derzeit herauszufinden, wie ich über alle Objekte in einer JSON-Antwort iterieren kann. Mein Objekt kann endlose Unterobjekte haben und sie können auch endlose Unterobjekte haben.jQuery und Iterieren auf JSON-Objekte

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

Ich habe mich nur gefragt, ob es ein Out-of-the-Box-Skript gibt, das mit solchen Objekten umgehen kann?

+0

+1 für den Namen und die interessante Frage. Ich glaube nicht, dass ich unbedingt die Art der Datenstruktur verwende, die Sie verwenden, es scheint, als könnte es auf beiden Seiten teuer sein. Die sind wahrscheinlich viel bessere Lösungen, die nicht den Baum gehen müssen. Vielleicht könnten Sie näher erläutern, was Sie mit den Daten zu tun versuchen (wenn Sie die interessanten Teile finden). – Gabriel

+0

Im Allgemeinen ist es besser, das allgemeine Format der Antwort zu kennen. Die Stärke von JSON liegt in der Fähigkeit, Objekte per Schlüssel zu erhalten. Wenn Sie jetzt eine Idee haben, was die Schlüssel oder Werte sind, noch was das Format ist, dann ist JSON wahrscheinlich nicht für Sie. – Alex

+0

Bitte verwenden Sie keine [Signaturen oder Taglines] (http://stackoverflow.com/faq#signatures) in Ihren Posts. – meagar

Antwort

4

Hier ist eine kleine Funktion, die die Tiefe der Wanderung durch den Baum verfolgt, mit Stationen auf dem Weg, damit Sie eine Aktion tun durchführen (Sie nicht angeben, was Sie eigentlich tun wollen, oder wenn):

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)); 

Unter der Annahme, obj Ihre JSON wie oben ist, sollte dies Sie so etwas wie (nicht getestet) geben:

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

Dies wird die Arbeit tun, die ich brauche! Vielen Dank! – tftd

1

Sobald Sie die JSON in ein Objekt analysiert haben, werden Sie benötigen einen Baum-Walker (eine rekursive Funktion) zu implementieren, insbesondere Werte, die Sie daran interessiert sind zu finden.

jedoch Jörder werden Sie wahrscheinlich helfen Sehr viel, es bietet Datenmanagement-Funktionen, das spart Ihnen das Schreiben eines Baum-Walker. und macht eine gute, performante Suche und Sortierung.

https://github.com/danstocker/jorder

0

Die jQuery JavaScirpt Bibliothek hat nur die Methode:

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

alert(jsonObject['obj1']); 

Die parseJSON() method akzeptiert einen JSON-String (das ist, was man von einem JSON Anfrage bekommen würde) und gibt ein JavaScript-Objekt. Von dort aus können Sie auf die Daten zugreifen, wie Sie es normalerweise mit jedem JavaScript-Objekt tun würden.

+0

Oh, ich vermutete, dass der Teufel weiß, wie man den JSON zum Objekt macht. – ocodo

+0

@Slomojo Ah ja, ich denke, ich habe den Punkt der Frage verpasst. –

+0

@Marus, vielleicht nicht! Iterating, wurde ursprünglich "irritierend" geschrieben – ocodo

2

Was Sie in Ihrer Frage dargestellt haben, ist nicht JSON, es ist ein JavaScript-Objekt-Literal. Der Unterschied besteht darin, dass eins eine Zeichenfolge ist und eine ein tatsächliches literales Objekt, das ohne weitere Konvertierung in JavaScript verwendet werden kann.

Um ein JS Object Literal zu begehen, verwenden Sie eine einfache rekursive for-Schleife. Sie benötigen dafür keine separate Bibliothek.

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

das ist ein großartiges Beispiel! – Mrchief

0

ich diesen Code-Schnipsel bin mit zu Fuß durch de json. Grundsätzlich, wenn der Knoten ein Objekt ist, rufe ich die gleiche Funktion rekursiv. Ich hoffe, Sie finden es nützlich.

Es braucht, wie Sie sehen können, jQuery. Es kann auch ohne die gleiche Idee gemacht werden.

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; 
     } 



}); 

};

Verwandte Themen