2009-05-22 13 views
6

Ciao mi stavo chiedendo se è possibile eseguire il cast della mia stringa JSON come oggetto personalizzato?Cast JSON come oggetto ActionScript personalizzato?

fondamentalmente:

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

saluti Adlertz

+0

Puoi aggiungere "in ActionScript" per il titolo? –

+0

non è specifico per l'actionscript, mi è capitato di usarlo in actionscript. –

risposta

4

In AS3, non si può lanciare un oggetto dinamico per una classe personalizzata utilizzando come o CustomClass (customObject).

È tuttavia possibile utilizzare alcuni trucchi semplici come soluzione alternativa. Ad esempio, è possibile dichiarare un costruttore per la propria classe personalizzata accettando un oggetto e inizializzando i suoi membri con le proprietà dell'oggetto.

Si potrebbe quindi utilizzare:

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

PS. Per quanto riguarda i commenti, questo non è vero per ogni lingua ... Immagino che lo renda specifico per lo script.

3

Per sé, questo non è possibile. E questo non ha nulla a che fare con ActionScript. Nella maggior parte delle altre lingue si ha lo stesso problema, dal momento che sul lato sinistro si ha un oggetto anonimo, se la lingua supporta qualsiasi cosa o un hash. Ad ogni modo. Ci sono diverse soluzioni, questo sarebbe uno, in grado di gestire un paio di cose:

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; 
     }    
    } 
} 

restrizioni:

  1. fallirà se il vostro panico di classe, se viene spammato con valori nulli sulla costruzione, o la costruttore ha bisogno di più di 9 argomenti
  2. non, e anche non può ricorsivi, quindi può semplicemente assegnare gli oggetti anonimi o array alle proprietà dell'istanza restituito

Speranza che aiuta comunque;)

greetz

back2dos

0

Non puoi lanciare oggetti personalizzati da oggetti dinamici. Ma è possibile estendere il decodificatore JSON da as3corelib. L'ho fatto esattamente per questo motivo. Quando decodifico una stringa json, passo il nome della classe dell'oggetto codificato. Con un po 'di riflessione si ottiene un oggetto personalizzato fortemente tipizzato. Ovviamente è necessario conoscere il nome della classe dell'oggetto codificato prima della decodifica ...

2

In realtà, è possibile eseguire il rendering di questa restrizione utilizzando il parser incorporato e ignorando il metodo JSON.parse e sfruttando l'ambito dell'anonimo funzione per accedere a un oggetto nella funzione genitore.

Per esempio - controllare questo frammento di codice

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 il codice di esempio come è - la classe MutatorData deve essere dichiarata dinamica, che sconfigge QUASI lo scopo di creare una classe per esso.Non sarai in grado di impedire ad altri codificatori di aggiungere delle proprietà, gli errori di ortografia nella tua stringa JSON diventeranno proprietà sull'oggetto. Evenso, otterrai alcuni RTTI e suggerimenti sul codice nell'IDE, il che può aiutare a prevenire errori di programmazione.

Ma sarebbe semplice scrivere una versione personalizzata del metodo parse che avrebbe funzionato con una classe finale (non dinamica).

Sul progetto Attualmente sto lavorando su - memoria e le prestazioni di esecuzione sono fondamentali, e noi preferiscono utilizzare i parser personalizzati per queste ragioni:

1) ci permette di alterare l'oggetto strettamente digitato al get-go e rinunciare a copiare i dati in un oggetto generico temporaneo.

2) È possibile creare il validatore direttamente nel parser, generando gli errori di runtime necessari per notificare al programma che abbiamo ricevuto dati JSON errati.