2009-05-22 12 views
6

Hallo Ich frage mich, ob es möglich ist, meine JSON-Zeichenfolge als ein benutzerdefiniertes Objekt zu werfen?JSON als benutzerdefiniertes ActionScript-Objekt umwandeln?

im Grunde:

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

Grüße Adlertz

+0

Können Sie hinzufügen "in Actionscript" auf den Titel? –

+0

es ist nicht ActionScript-spezifisch, ich verwende es einfach in ActionScript. –

Antwort

4

In AS3, können Sie nicht ein dynamisches Objekt zu einer benutzerdefinierten Klasse werfen mit als oder Custom (customObject).

Sie können jedoch einige einfache Tricks als Workaround verwenden. Sie könnten beispielsweise einen Konstruktor für Ihre benutzerdefinierte Klasse deklarieren, indem Sie ein Objekt akzeptieren und dessen Mitglieder mit den Objekteigenschaften initialisieren.

Sie würden dann verwenden:

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

PS. Bezüglich der Kommentare gilt das nicht für jede Sprache ... Ich denke, das macht es actionscript specific.

3

Per se ist dies nicht möglich. Und das hat nichts mit ActionScript zu tun. In den meisten anderen Sprachen haben Sie das gleiche Problem, da Sie auf der linken Seite ein anonymes Objekt haben, wenn die Sprache dies unterstützt, oder ein Hash. Wie auch immer. Es gibt verschiedene Lösungen, diese sein würde, dass ein paar Dinge handhaben können:

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

Einschränkungen:

  1. wird scheitern, wenn Ihre Klasse in Panik geraten, wenn sie mit Nullen auf Bau spammed ist oder die Konstruktor braucht mehr als 9 Argumente
  2. nicht, und auch nicht Rekursion kann, so dass es einfach anonyme Objekte oder Arrays an die zurück Instanz Eigenschaften zuordnen können

hoffen, dass es sowieso hilft;)

greetz

back2dos

0

Sie können keine benutzerdefinierten Objekte aus dynamischen Objekte werfen. Aber Sie können den JSON-Decoder von as3corelib erweitern. Das habe ich genau aus diesem Grund getan. Wenn ich einen json-String dekodiere, überlasse ich den Klassennamen des codierten Objekts. Mit etwas Reflektion erhalten Sie ein stark typisiertes benutzerdefiniertes Objekt zurück. Natürlich müssen Sie den Klassennamen des codierten Objekts vor der Decodierung kennen ...

2

Eigentlich können Sie diese Einschränkung umgehen, indem Sie den Build-Parser verwenden und die JSON.parse-Methode außer Kraft setzen und den Umfang des Anonymous ausnutzen Funktion, um auf ein Objekt in der Elternfunktion zuzugreifen.

Zum Beispiel - lesen Sie in diesem Code-Schnipsel

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

Mit dem Codebeispiel wie - die MutatorData Klasse dynamisch deklariert werden, was fast dem Zweck, eine Klasse für sie zu schaffen.Sie können nicht verhindern, dass andere Codierer Eigenschaften hinzufügen, Rechtschreibfehler in Ihrer JSON-Zeichenfolge werden zu Eigenschaften des Objekts. Außerdem erhalten Sie einige RTTI- und Codehinweise in der IDE - wodurch Codiererfehler vermieden werden können.

Aber es wäre eine einfache Sache, eine benutzerdefinierte Version der Parse-Methode zu schreiben, die mit einer endgültigen (nicht dynamischen) Klasse arbeiten würde.

Auf dem Projekt Zur Zeit arbeite ich an - Speicher und Laufzeit-Performance entscheidend ist, und wir bevorzugen benutzerdefinierte Parser aus diesen Gründen verwenden:

1) Es uns das streng typisierte Objekt zu verändern, ermöglicht bei dem ich gehen- und auf das Kopieren der Daten in ein temporäres generisches Objekt verzichten.

2) Wir können den Validator direkt in den Parser einbauen, indem wir Laufzeitfehler ausgeben, um das Programm zu benachrichtigen, dass wir falsche JSON-Daten erhalten haben.

Verwandte Themen