2009-11-11 28 views
7

Tengo un poco de un dilema. Tengo un objeto JSON que tiene un formato con el que no estoy familiarizado (comienza con una matriz [] en lugar de un objeto {}) y me preguntaba cómo podría analizarlo en AS3. El objeto se ve así:AS3 Análisis JSON

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

Realmente no sé cómo llego a cada matriz de alimentos, y cada objeto dentro de ella. ¡Cualquier ayuda sería muy apreciada! ¡Gracias!

Respuesta

12

Usted tendrá que utilizar la clase de objeto JSON (enlace más abajo) http://code.google.com/p/as3corelib/

y luego algo como esto ..

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

He intentado usar ese método, sin embargo con el JSON que he publicado anteriormente, ¿Es necesario comenzar con una JSONArray primero, y luego un objeto JSON? ya que está envuelto primero por [] y luego por {}. – dtrainer45

+2

+1 AS3corelib es bueno. @ dtrainer45: si usa adobe flexbuilder, agregue un punto de interrupción después de deserializar la cadena json. Luego puedes explorar la estructura del gráfico de objetos creado. Si es una matriz, probablemente debería ser algo así como var x: JSONObject = new JSONObject (data); trace (x [0] .food [0] .name); no probado, sin embargo. – Max

7

estructura de datos Interesante ... esto debe hacerlo:

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

de flash player 11, y sdk 4.6 hay soporte nativo para json. Para usarlo debe cambiar

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

a

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

mientras JSON no es de as3corelib sino de SDK en sí. Bastante más rápido;)

+3

Lo único que se debe cambiar es que 'var foods: Array' se debe cambiar a' var foods: Object'. Cuando probé con Array, dijo que el tipo no era válido para lo que devuelve JSON.parse. – LoneWolfPR

+0

"Acceso a la propiedad indefinida JSON". – Meekohi

+0

estoy usando sdk 4.5, tengo esta clase JSON también – jondinham

2

Estaba buscando una alternativa a una biblioteca y encontré la técnica here. Supongo que esto funcionará en el contexto de la operación (que fue respondida hace años, por supuesto), ya que no requiere un tipo de devolución de Objeto. Esto funciona bien para lo que estaba tratando de hacer cuando encontré esta publicación y encontré la solución bastante elegante para flash basada en el navegador.

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

** Nota: ** Como es, esta es una gran vulnerabilidad de seguridad. Sería mejor usar: 'ExternalInterface.call (" function() {return JSON.decode ('"+ data.replace (/ ([' \\])/g," \\ $ 1 "); +" ');} ")' – brianreavis

+1

@brianreavis: solo 'ExternalInterface.call ('JSON.parse', data)' debería hacerlo :-) –

+0

observado, gracias! En ese momento solo necesitaba que algo funcionara y yo tenía el control de la fuente de datos. Como un aparte, esto no funcionará con IE7 y más bajo debido a la falta de una API nativa de JSON según esta pregunta: http://stackoverflow.com/questions/4908875/is-json-parse-supported-by-all-major -browsers – Shane