2009-11-11 13 views
7

Ich habe ein kleines Dilemma. Ich habe ein JSON-Objekt, das ein Format hat, das ich nicht kenne (beginnt mit einem Array [] anstelle eines Objekts {}) und fragte mich, wie ich es in AS3 analysieren könnte. Das Objekt sieht so aus:AS3 JSON Parsing

[ 
    { 
     "food": [ 
      { 
       "name": "pasta", 
       "price": 14.50, 
       "quantity": 20 
      }, 
      { 
       "name": "soup", 
       "price": 6.50, 
       "quantity": 4 
      } 
     ] 
    }, 
    { 
     "food": [ 
      { 
       "name": "salad", 
       "price": 2.50, 
       "quantity": 3 
      }, 
      { 
       "name": "pizza", 
       "price": 4.50, 
       "quantity": 2 
      } 
     ] 
    } 
] 

Ich weiß nicht wirklich, wie ich zu jedem Essen Array und jedem Objekt darin komme. Jede Hilfe würde sehr geschätzt werden! Vielen Dank!

Antwort

12

Sie müssen die JSON-Objekt-Klasse (Link unten) verwenden http://code.google.com/p/as3corelib/

und dann so etwas wie diese ..

var data:String = "{\"name\":\"pizza\",\"price\":\"4.50\",\"quantity\":\"2\"}"; 
var food:JSONObject = new JSONObject(data); 
trace(food.name); // Pizza 
trace(food.price); // 4.50 
trace(food.quantity); // 2 
food.number++; 
var newData:String = String(food); 
trace(newData); // {"name":"pizza","price":"4.50","quantity":"2"} 
+0

Ich habe versucht, diese Methode zu verwenden, aber mit dem JSON ich oben geschrieben habe, muss ich mit einem JSONArray zuerst und dann ein JSON-Objekt beginnen? da es zuerst von [] und dann von {} umschlossen wird. – dtrainer45

+2

+1 AS3corelib ist gut. @ dtrainer45: Wenn Sie Adobe Flexbuilder verwenden, fügen Sie nach dem Deserialisieren der JSON-Zeichenfolge einen Haltepunkt hinzu. Dann können Sie die Struktur des erstellten Objektgraphen erkunden. Wenn es ein Array ist, sollte es wahrscheinlich so etwas wie var x sein: JSONObject = new JSONObject (data); Spur (x [0] .food [0] .name); nicht getestet. – Max

7

Interessante Datenstruktur ... das sollte es tun:

24

von Flash Player 11 und SDK 4.6 gibt es native Unterstützung für Json. Um es zu nutzen, sollten Sie

var foods:Array = JSON.decode(jsonstring); 

zu

var foods:Array = JSON.parse(jsonstring); 

ändern, während JSON nicht von as3corelib ist aber von sdk selbst. Ziemlich viel schneller;)

+3

Die einzige Sache, die geändert werden muss, ist, dass 'var foods: Array' in' var foods: Object' geändert werden sollte. Als ich mit Array versuchte, sagte der Typ war nicht gültig für was JSON.parse zurückgibt. – LoneWolfPR

+0

"Zugriff auf undefinierte Eigenschaft JSON." – Meekohi

+0

ich benutze sdk 4.5, ich habe auch diese JSON-Klasse – jondinham

2

Ich suchte nach einer Alternative zu einer Bibliothek und fand die Technik here. Ich gehe davon aus, dass dies im Kontext des Ops funktioniert (was natürlich vor Jahren beantwortet wurde), da es keinen Rückgabetyp von Objekt benötigt. Das funktioniert gut für das, was ich versucht habe, als ich diesen Post gefunden habe und ich fand die Lösung ziemlich elegant für Flash im Browser.

function json_decode(data:String):* { 
    try { 
    return ExternalInterface.call("function(){return " + data + "}"); 
    } catch (e:Error) { 
    return null; 
    } 
} 
+1

** Hinweis: ** Dies ist eine große Sicherheitslücke. Es wäre besser zu verwenden: 'ExternalInterface.call (" function() {return JSON.decode ('"+ data.replace (/ ([' \\])/g," \\ $ 1 "); + '');) ")' – brianreavis

+1

@brianreavis: nur 'ExternalInterface.call ('JSON.parse', Daten)' sollte es tun :-) –

+0

bemerkt, danke! Zu der Zeit brauchte ich nur etwas zu arbeiten und ich hatte die Kontrolle über die Datenquelle. Nebenbei gesagt, wird dies nicht mit IE7 und niedriger wegen des Fehlens eines nativen JSON API wie in dieser Frage funktionieren: http://StackOverflow.com/Questions/4908875/is-Json-Parse-Supported-By-All-Major -Browser – Shane