Как создать объект из строки в actionscript 3.0 (as3)

Как создать динамический объект из строки?

Вот мой текущий код с неправильными результатами:

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

Спасибо заранее!

Ответ 1

as3corelib содержит парсер JSON, который сделает это за вас. Убедитесь, что вы изучили список проблем, поскольку новых выпусков этой библиотеки не было, и в ней много ошибок, которые в основном адресованы в списке проблем.

Ответ 2

Я не знаю, если это лучший способ, но:

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 и возвращает новую строку без пробелов в начале или в конце строки.

Ответ 3

Для записи анализатор JSON не будет анализировать строку в примере, поскольку JSON требует котировок вокруг имен участников. Итак, строка:

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

... вместо этого должно быть:

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

Может быть немного запутанно, что объектная нотация, такая как {x: 200, y: 400}, которая действительна как в ActionScript, так и JavaScript, недействительна JSON, но если я правильно ее помню, цитаты вокруг имен членов необходимо избегать возможных конфликтов с зарезервированными словами.

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