2009-10-02 9 views
10

¿Cómo puedo crear un objeto dinámico a partir de una cadena?Cómo crear un objeto de una cadena en actionscript 3.0 (as3)

Aquí está mi código actual con resultados incorrectos:

var s1:String = '{x:200, y:400}'; 
var o1:Object = Object(s1); 

trace(o1); // result = {x:200, y:400} 
trace(o1.x) // result = ReferenceError: Error #1069: Property x not found on String and there is no default value. 
trace(o1.y) // result = ReferenceError: Error #1069: Property x not found on String and there is no default value. 

Me gustaría que el código anterior para emitir la siguiente:

trace(o1); // result = [object Object] 
trace(o1.x); // result = 200 
trace(o1.y); // result = 400 

Gracias de antemano!

Respuesta

4

as3corelib contiene un analizador JSON que podría hacer esto por usted. Asegúrese de estudiar el artículo issues list ya que no ha habido nuevas versiones de esta biblioteca y hay muchos errores en ella, que en su mayoría se abordan en la lista de problemas.

+1

estaba a punto de responder a la misma cosa :) para resolver el problema específico que Estaré usando la clase JSON en esa lib: 'JSON.decode (str)' y 'JSON.encode (obj)' para ir hacia el otro lado. – JStriedl

+0

Acerca de los errores, hay personas que lo arreglan. Ver: http://code.google.com/p/as3corelib/source/list. Solo necesitas echar un vistazo desde el SVN. –

+0

Como dije, "no hay nuevos lanzamientos", pero sí, es bueno saberlo. – spender

4

No sé si esta es la mejor manera, pero:

var serializedObject:String = '{x:200,y:400}' 
var object:Object = new Object() 

var contentWithoutBraces:String = serializedObject.substr(serializedObject.indexOf('{') + 1) 
contentWithoutBraces = contentWithoutBraces.substr(0, contentWithoutBraces.lastIndexOf('}')) 

var propertiesArray:Array = contentWithoutBraces.split(',') 

for (var i:uint = 0; i < propertiesArray.length; i++) 
{ 
    var objectProperty:Array = propertiesArray[i].split(':') 

    var propertyName:String = trim(objectProperty[0]) 
    var propertyValue:String = trim(objectProperty[1]) 

    object[propertyName] = Object(propertyValue) 
} 

trace(object) 
trace(object.x) 
trace(object.y) 

esto va a hacer lo que quiere.

Usted puede hacer esto de una manera recursiva por lo que si el objeto contiene otros objetos se convierten también;)

PS: No agrego la función de cortar, pero esta función recibo una cadena y devuelve una nueva cadena sin espacios al principio o al final de la cadena.

3

Para el registro, el analizador JSON no analizará la cadena en el ejemplo, ya que JSON requiere comillas alrededor de los nombres de los miembros. Por lo que la cadena:

var s1:String = '{x:200, y:400}'; 

... En vez de ello tiene que ser:

var s1:String = '{"x":200, "y":400}'; 

Puede ser un poco confuso que notación de objetos, como {x: 200, Y: 400}, es decir válido tanto en ActionScript como en JavaScript no es JSON válido, pero si no recuerdo mal, las citas de los nombres de los miembros son necesarias para evitar posibles conflictos con las palabras reservadas.

http://simonwillison.net/2006/Oct/11/json/

Cuestiones relacionadas