2009-11-11 6 views
7

Mam trochę dylematu. Mam obiekt JSON, którego format nie jest mi znany (zaczyna się od tablicy [] zamiast obiektu {}) i zastanawiałem się, jak mogę go sparsować w AS3. Obiekt wygląda następująco:AS3 JSON parsowanie

[ 
    { 
     "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 
      } 
     ] 
    } 
] 

ja naprawdę nie wiem, jak mogę dostać się do każdej tablicy żywności, a każdy obiekt w nim. Każda pomoc będzie bardzo ceniona! Dzięki!

Odpowiedz

12

Trzeba będzie użyć klasy obiektów JSON (poniżej link) http://code.google.com/p/as3corelib/

a potem coś takiego ..

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

Próbowałem już korzystać z tej metody, jednak z jsonem zamieszczonym powyżej, czy muszę najpierw uruchomić JSONArray, a następnie obiekt JSON? ponieważ jest on najpierw zawijany przez [], a następnie przez {}. – dtrainer45

+2

+1 AS3corelib jest dobre. @ dtrainer45: jeśli używasz Flexbuilder firmy Adobe, dodaj punkt przerwania po deserializacji łańcucha json. Następnie możesz zbadać strukturę utworzonego wykresu obiektu. Jeśli jest to tablica, prawdopodobnie powinna to być coś w stylu var x: JSONObject = new JSONObject (data); trace (x [0] .food [0] .name); nie testowane jednak. – Max

7

Ciekawe datastructure ... powinien to zrobić:

import com.adobe.serialization.json.JSON; 
/* ... other code ... */ 
var foods:Array = JSON.decode(jsonstring); 
for(var i:int = 0; i < foods.length; i++) { 
    for(var j:int = 0; j < foods[i].length; j++) { 
    trace(foods[i][j].name); 
    } 
} 
24

z Flash Player 11 i sdk 4.6 istnieje natywna obsługa json. Aby z niego skorzystać należy zmienić

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

do

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

podczas JSON nie jest z as3corelib ale od samego SDK. O wiele szybciej;)

+3

Jedyne, co należy zmienić, to że 'var foods: Array' powinien zostać zmieniony na' var foods: Object'. Kiedy próbowałem z Array, powiedział, że typ nie był prawidłowy dla tego, co zwraca JSON.parse. – LoneWolfPR

+0

"Dostęp do niezdefiniowanej właściwości JSON." – Meekohi

+0

Używam sdk 4.5, mam również tę klasę JSON – jondinham

2

Szukałem alternatywy dla biblioteki i znalazłem technikę here. Zakładam, że będzie to działało w kontekście op (na co odpowiedziano wiele lat temu), ponieważ nie wymaga typu zwracanego Object. Działa to dobrze dla tego, co starałem się zrobić, gdy znalazłem ten post i znalazłem rozwiązanie dość eleganckie dla Flash oparte w przeglądarce.

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

** Uwaga: ** Jak na to, jest to duża luka w zabezpieczeniach. Byłoby lepiej użyć: 'ExternalInterface.call (" function() {return JSON.decode ("" + data.replace (/ (['\\])/g, "\\ $ 1"); + "');) ")' – brianreavis

+1

@ brianreavis: po prostu 'ExternalInterface.call (" JSON.parse ", dane)' powinien zrobić to :-) –

+0

zauważyć, dzięki! W tym czasie po prostu potrzebowałem, aby coś działało i miałem kontrolę nad źródłem danych. Na marginesie, to nie zadziała z IE7 i niższe z powodu braku natywnego API JSON, jak na to pytanie: http://stackoverflow.com/questions/4908875/is-json-parse-supported-by-all-major -browsers – Shane