Actionscript - 复杂对象的JSON

时间:2013-06-17 21:42:55

标签: actionscript-3 flash actionscript

我正在尝试对flash.geom.Rectange对象进行JSON编码和解码。解码对象时,它的类型为Object。如果我尝试将其强制转换为Rectangle,我会得到一个空对象:

var rect:Rectangle = JSON.decode(json_string) as Rectangle;

看起来我无法从Object转换为与Rectangle具有完全相同属性的Rectangle。

一个选项是将属性从Object复制到Rectangle。

我正在查看introspection of objects但是,迭代对象的属性只会深入一级。如果正在复制的属性的类型为Point,则不会复制Point的属性。看起来我必须递归复制它们。

动作脚本中是否有深度复制对象的函数?

2 个答案:

答案 0 :(得分:4)

简答 - 否。您必须将已解码的JSON对象的组件传递给新的Rectangle。

var jRect:Object = JSON.decode(json_string);
var rect:Rectangle = new Rectangle(jRect.x, jRect.y, jRect.width, jRect.height);

在这种情况下,您很幸运,因为您提到的点是从构造函数值推断出来的。对于更复杂的类,我通常从JSON方法创建类级别。

答案 1 :(得分:0)

这是我提出的复制功能。使用像Rectangle这样的简单类型进行测试。 那里有一个try / catch语句,因为当我尝试写入只读属性时,我遇到异常。应该有一个if语句来检查属性是否可写,但我现在没有时间或耐心。我稍后会回来改进它,但现在它是:

public static function copy(source:Object, dest:Object):void
{
    for (var prop in source)
    {
        if (getQualifiedClassName(source[prop]) == "Object")
        {
            copy(source[prop], dest[prop]);
        }
        else
        {
            try // bad. should really be an if statement to check if property is writable. 
            {
                dest[prop] = source[prop];
            }
            catch (err:Error)   {}
        }
    }       
}