2009-05-22 6 views
6

Hola, me preguntaba si es posible convertir mi cadena JSON como un objeto personalizado.¿Lanzar JSON como un objeto de ActionScript personalizado?

básicamente:

var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject; 

Saludos Adlertz

+0

Se puede añadir "en ActionScript" para el título? –

+0

no es específico de actionscript, simplemente lo uso en actionscript. –

Respuesta

4

En AS3, no se puede lanzar un objeto dinámico a una clase personalizada utilizando como o CustomClass (customObject).

Sin embargo, puede utilizar algunos trucos simples como solución alternativa. Por ejemplo, podría declarar un constructor para su clase personalizada aceptando un Objeto e inicializando sus miembros con las propiedades del objeto.

A continuación, utilizar:

var customObject:CustomClass = new CustomClass(JSON.decode(evt.result as String)); 

PS. En cuanto a los comentarios, esto no es cierto para todos los idiomas ... Supongo que lo hace actionscript specific.

3

Per se, esto no es posible. Y eso no tiene nada que ver con ActionScript. En la mayoría de los otros idiomas, tiene el mismo problema, ya que en el lado izquierdo tiene un objeto anónimo, si el lenguaje admite algo así, o un hash. De todos modos. Existen diferentes soluciones, este sería uno, que puede manejar un par de cosas:

package { 
    public class ObjectUtils { 
     public static function createInstance(constructor:Class):* { 
      var ret:*; 
      switch (describeType(to).factory.constructor.parameter.(@optional == "false").length()) { 
       case 0: ret = new to(); break; 
       case 1: ret = new to(null); break; 
       case 2: ret = new to(null, null); break; 
       case 3: ret = new to(null, null, null); break; 
       case 4: ret = new to(null, null, null, null); break; 
       case 5: ret = new to(null, null, null, null, null); break; 
       case 6: ret = new to(null, null, null, null, null, null); break; 
       case 7: ret = new to(null, null, null, null, null, null, null); break; 
       case 8: ret = new to(null, null, null, null, null, null, null, null); break; 
       case 9: ret = new to(null, null, null, null, null, null, null, null, null); break;   
       default: throw new Error("no implementation for instantiating classes that require more than 9 constructor arguments"); 
      } 
      return ret; 
     } 
     public static function castAnonymous(obj:Object, to:Class):* { 
      var ret = createInstance(obj); 
      for (var name:String in obj) 
       try { 
        ret[name] = obj[name]; 
       } 
       catch (e:Error) { 
        throw new Error("error trying to assign value " + obj[name] + " to property " + name + " on " + ret + ". reason: " + e); 
       } 
      return ret; 
     }    
    } 
} 

restricciones:

  1. fallarán si el pánico de clase, si es correo basura con nulos sobre la construcción o el constructor necesita más de 9 argumentos
  2. no, y también puede no recursivos, por lo que simplemente puede asignar objetos anónimos o matrices de las propiedades de la instancia devuelta

creo que sirve de todos modos;)

greetz

back2dos

0

No se puede lanzar objetos personalizados a partir de objetos dinámicos. Pero puede extender el decodificador JSON desde as3corelib. Lo hice por exactamente esta razón. Cuando estoy decodificando un json-String, paso el nombre de clase del objeto codificado. Con un poco de uso de la reflexión, obtienes un sólido objeto personalizado a máquina. Por supuesto, necesita saber el nombre de la clase del objeto codificado antes de decodificar ...

2

En realidad, puede piratear esta restricción usando la compilación en el analizador y anulando el método JSON.parse y aprovechando el alcance del anónimo función para acceder a un objeto en la función principal.

Por ejemplo - echa un vistazo a este fragmento de código

public dynamic class MutatorData extends Object 
{ 
    public var DisplayName:String; 
    public var PropertyName:String; 
} 

public function parseData(data:String) 
{ 
    var mutator:MutatorData = new MutatorData(); 

    JSON.parse(data, 
     function (k, v) { 
     mutator[k] = v; 
     }); 
} 

Con el ejemplo de código como es - la clase MutatorData tiene que ser declarado dinámico, lo que contradice CASI el propósito de crear una clase para él.No podrá evitar que otros codificadores le agreguen propiedades, los errores ortográficos en su cadena JSON se convertirán en propiedades en el objeto. Evenso, obtendrá algo de RTTI y sugerencia de código en el IDE, lo que puede ayudar a prevenir el error del codificador.

Pero sería una simple cuestión de escribir una versión personalizada del método de análisis sintáctico que funcionaría con una clase final (no dinámica).

En el proyecto que estoy trabajando actualmente - la memoria y el rendimiento de ejecución son críticos, y preferimos el uso de programas de análisis personalizados por estas razones:

1) nos permite alterar el objeto estrictamente escrito en el primer momento y renuncia a copiar los datos en un objeto genérico temporal.

2) Podemos construir el validador directamente en el analizador, lanzando errores de tiempo de ejecución como sea necesario para notificar al programa que hemos recibido datos JSON incorrectos.

Cuestiones relacionadas