如何在actionscript 3.0(as3)中从字符串创建对象

时间:2009-10-02 16:19:15

标签: flash actionscript-3 actionscript

如何从字符串创建动态对象?

这是我当前的代码,结果不正确:

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.

我希望以前的代码输出以下内容:

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

提前致谢!

4 个答案:

答案 0 :(得分:4)

as3corelib包含一个JSON解析器,可以为您执行此操作。请确保您学习issues list,因为此库没有新版本,并且其中存在大量错误,主要在问题列表中解决。

答案 1 :(得分:4)

我不知道这是不是最好的方法,但是:

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)

这将做你想要的。

您可以以递归方式执行此操作,因此如果对象包含其他对象也会被转换;)

PS:我没有添加trim函数,但是这个函数接收一个String并在String的开头或结尾返回一个没有空格的新String。

答案 2 :(得分:3)

对于记录,JSON解析器不会解析示例中的字符串,因为JSON需要引用成员名称。所以字符串:

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

...反而必须是:

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

在ActionScript和JavaScript中有效的对象表示法(如{x:200,y:400})可能有点令人困惑,但是如果我没记错,那么成员名称周围的引号是必须避免与保留字的可能冲突。

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

答案 3 :(得分:1)

较新版本的Flash Player包含顶级JSON类,请阅读doc: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/JSON.html