2009-10-02 8 views
10

Wie kann ich ein dynamisches Objekt aus einer Zeichenfolge erstellen?So erstellen Sie ein Objekt aus einer Zeichenfolge in ActionScript 3.0 (as3)

Hier ist mein aktueller Code mit falschen Ergebnissen:

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

Vielen Dank im Voraus:

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. 

ich folgend den vorherigen Code ausgeben möchte!

Antwort

4

as3corelib enthält einen JSON-Parser, der das für Sie tun würde. Stellen Sie sicher, dass Sie die issues list studieren, da es keine neuen Versionen dieser Bibliothek gab und es viele Bugs gibt, die hauptsächlich in der Problemliste behandelt werden.

+1

Ich war gerade dabei, die gleiche Sache zu beantworten :) das spezifische Problem lösen Sie verwende die JSON-Klasse in dieser lib: 'JSON.decode (str)' und 'JSON.encode (obj)', um in die andere Richtung zu gehen. – JStriedl

+0

Über die Fehler, es gibt Leute, die es reparieren. Siehe: http://code.google.com/p/as3corelib/source/list. Sie müssen nur aus dem SVN auschecken. –

+0

Wie gesagt, "keine neuen Veröffentlichungen", aber ja, das ist gut zu wissen. – spender

4

Ich weiß nicht, ob dies der beste Weg ist, aber:

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) 

Dies wird tun, was Sie wollen.

Sie können dies in einer rekursiven Weise so, wenn das Objekt andere Objekte enthält auch umgewandelt werden;)

PS: Ich fügen Sie nicht die Trimm-Funktion, aber diese Funktion einen String empfangen und gibt einen neuen String ohne Leerzeichen am Anfang oder am Ende des Strings.

3

Für den Datensatz wird der JSON-Parser die Zeichenfolge im Beispiel nicht analysieren, da JSON Anführungszeichen um Elementnamen benötigt. So ist die Zeichenfolge:

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

... stattdessen sein müssen:

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

Es kann etwas sein, das Objekt Notation verwirrend, wie {x 200, y: 400}, dh gültig in ActionScript und JavaScript ist kein gültiger JSON, aber wenn ich mich recht erinnere, sind die Anführungszeichen um die Elementnamen notwendig, um mögliche Konflikte mit reservierten Wörtern zu vermeiden.

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

Verwandte Themen