如何从字符串创建动态对象?
这是我当前的代码,结果不正确:
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
提前致谢!
答案 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})可能有点令人困惑,但是如果我没记错,那么成员名称周围的引号是必须避免与保留字的可能冲突。
答案 3 :(得分:1)
较新版本的Flash Player包含顶级JSON类,请阅读doc: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/JSON.html