2012-04-03 12 views
56

Ich benutze Sencha Touch (ExtJS), um eine JSON-Nachricht vom Server zu erhalten. Die Botschaft, die ich erhalten, ist diese:Javascript, wie JSON Array zu analysieren

{ 
"success": true, 
"counters": [ 
    { 
     "counter_name": "dsd", 
     "counter_type": "sds", 
     "counter_unit": "sds" 
    }, 
    { 
     "counter_name": "gdg", 
     "counter_type": "dfd", 
     "counter_unit": "ds" 
    }, 
    { 
     "counter_name": "sdsData", 
     "counter_type": "sds", 
     "counter_unit": " dd  " 
    }, 
    { 
     "counter_name": "Stoc final", 
     "counter_type": "number ", 
     "counter_unit": "litri  " 
    }, 
    { 
     "counter_name": "Consum GPL", 
     "counter_type": "number ", 
     "counter_unit": "litri  " 
    }, 
    { 
     "counter_name": "sdg", 
     "counter_type": "dfg", 
     "counter_unit": "gfgd" 
    }, 
    { 
     "counter_name": "dfgd", 
     "counter_type": "fgf", 
     "counter_unit": "liggtggggri  " 
    }, 
    { 
     "counter_name": "fgd", 
     "counter_type": "dfg", 
     "counter_unit": "kwfgf  " 
    }, 
    { 
     "counter_name": "dfg", 
     "counter_type": "dfg", 
     "counter_unit": "dg" 
    }, 
    { 
     "counter_name": "gd", 
     "counter_type": "dfg", 
     "counter_unit": "dfg" 
    } 

    ] 
} 

Mein Problem ist, dass ich nicht dieses JSON-Objekt analysieren kann, so dass ich jede der Indikatorobjekte verwenden können.

Ich versuche, dass so zu erledige:

var jsonData = Ext.util.JSON.decode(myMessage); 
for (var counter in jsonData.counters) { 
    console.log(counter.counter_name); 
} 

Was mache ich falsch? Vielen Dank!

+1

Mögliches Duplikat von [Sicheres Umdrehen eines JSON-Strings in ein Objekt] (https://stackoverflow.com/questions/45015/safely-turning-a-json-string-into-an-object) –

Antwort

88

Javascript a hat für Strings in JSON Parse gebaut, was meiner Meinung nach ist das, was Sie haben:

var myObject = JSON.parse("my json string"); 

dies mit Ihrem Beispiel zu verwenden wäre:

var jsonData = JSON.parse(myMessage); 
for (var i = 0; i < jsonData.counters.length; i++) { 
    var counter = jsonData.counters[i]; 
    console.log(counter.counter_name); 
} 

Here is a working example

EDIT: Es gibt einen Fehler in Ihrer Verwendung von for-Schleife (Ich verpasste dies bei meinem ersten lesen, Kredit zu @Evert für den Spot). Bei Verwendung einer for-in-Schleife wird var als Eigenschaftsname der aktuellen Schleife festgelegt, nicht die eigentlichen Daten. Siehe meine aktualisierte Schleife oben für die korrekte Verwendung

WICHTIG: die JSON.parse Methode wird nicht in alten alten Browsern arbeitet - so, wenn Sie Ihre Website durch eine Art Zeitbiegeinternetverbindung zu machen, könnte dies ein Problem sein! Wenn Sie wirklich interessiert sind, here is a support chart (was alle meine Kästchen ankreuzen).

+1

Wenn er ein Bibliothek, die eine Cross-Browser-parseJSON-Funktion unterstützt, sollte er das verwenden. Außerdem wiederholen Sie den Schleifenfehler. – Bergi

+0

danke @musefan. Arbeitete wie ein Charme – maephisto

+0

Ich bekomme einen Fehler in der ersten Zeile, wenn ich dies ausführen: Uncaught SyntaxError: Unerwartete Token o – nights

4

In einer For-In-Schleife enthält die laufende Variable den Namen der Eigenschaft, nicht den Wert der Eigenschaft.

for (var counter in jsonData.counters) { 
    console.log(jsonData.counters[counter].counter_name); 
} 

Aber als Zähler ein Array ist, müssen Sie einen normalen for-Schleife verwenden:

for (var i=0; i<jsonData.counters.length; i++) { 
    var counter = jsonData.counters[i]; 
    console.log(counter.counter_name); 
} 
0

Sie einen Datenspeicher und Proxy in ExtJs verwenden sollten. Es gibt viele examples davon, und der JSON-Reader analysiert die JSON-Nachricht automatisch in das von Ihnen angegebene Modell.

Es ist nicht notwendig, Basic-Javascript zu verwenden, wenn ExtJs verwendet wird, alles ist anders, Sie sollten die ExtJs-Möglichkeiten verwenden, um alles richtig zu machen. Lesen Sie die Dokumentation sorgfältig durch, es ist gut.

Diese Beispiele gelten übrigens auch für Sencha Touch (v2), das auf den gleichen Kernfunktionen wie ExtJs basiert.

2

Dies ist meine Antwort,

<!DOCTYPE html> 
<html> 
<body> 
<h2>Create Object from JSON String</h2> 
<p> 
First Name: <span id="fname"></span><br> 
Last Name: <span id="lname"></span><br> 
</p> 
<script> 
var txt = '{"employees":[' + 
'{"firstName":"John","lastName":"Doe" },' + 
'{"firstName":"Anna","lastName":"Smith" },' + 
'{"firstName":"Peter","lastName":"Jones" }]}'; 

//var jsonData = eval ("(" + txt + ")"); 
var jsonData = JSON.parse(txt); 
for (var i = 0; i < jsonData.employees.length; i++) { 
    var counter = jsonData.employees[i]; 
    //console.log(counter.counter_name); 
    alert(counter.firstName); 
} 

</script> 
</body> 
</html> 
+2

Referenz W3 Schulen für das obige Beispiel. http://www.w3schools.com/json/json_syntax.asp –

1

"Sencha way", um mit Server-Daten interagieren setzt eine Ext.data.Store durch einen Ext.data.proxy.Proxy (in diesem Fall Ext.data.proxy.Ajax) ausgestattet mit einem Ext.data.reader.Json (für JSON-codierte Daten gibt andere Leser sind proxied up auch). Zum Schreiben von Daten zurück auf den Server gibt es eine Ext.data.writer.Writer s von verschiedenen Arten.

Hier ist ein Beispiel für eine Einrichtung wie folgt aus:

var store = Ext.create('Ext.data.Store', { 
     fields: [ 
      'counter_name', 
      'counter_type', 
      'counter_unit' 
     ], 

     proxy: { 
      type: 'ajax', 
      url: 'data1.json', 

      reader: { 
       type: 'json', 
       idProperty: 'counter_name', 
       rootProperty: 'counters' 
      } 
     } 
    }); 

data1.json in diesem Beispiel (auch in this fiddle) enthält Ihre Daten wörtlich. idProperty: 'counter_name' ist in diesem Fall wahrscheinlich optional, zeigt aber normalerweise auf das Primärschlüsselattribut. rootProperty: 'counters' gibt an, welche Eigenschaft ein Array von Datenelementen enthält.

Mit einem Store-Setup auf diese Weise können Sie Daten vom Server erneut lesen, indem Sie store.load() aufrufen. Sie können das Geschäft auch mit beliebigen Sencha Touch-geeigneten UI-Komponenten wie Grids, Listen oder Formularen verbinden.

Verwandte Themen