将JSON转换为自定义ActionScript对象?

时间:2009-05-22 12:17:29

标签: flash actionscript-3 json object casting

您好我想知道是否可以将我的JSON字符串转换为自定义对象?

基本上:

var customObject:CustomObject = JSON.decode(evt.result as String) as CustomObject;

关心Adlertz

5 个答案:

答案 0 :(得分:4)

在AS3中,您无法使用作为 CustomClass(customObject)将动态对象强制转换为自定义类。

但是,您可以使用一些简单的技巧作为解决方法。 例如,您可以为自定义类声明一个接受Object的构造函数,并使用对象属性初始化它的成员。

然后您将使用:

var customObject:CustomClass = new CustomClass(JSON.decode(evt.result as String));

PS。关于评论,对于每种语言都不是这样......我想这会使 actionscript特定

答案 1 :(得分:3)

本身,这是不可能的。这与ActionScript无关。在大多数其他语言中,你有同样的问题,因为在左侧你有一个匿名对象,如果语言支持任何这样的东西,或哈希。 无论如何。有不同的解决方案,这可以是一个,可以处理一些事情:

package  {
    public class ObjectUtils {
        public static function createInstance(constructor:Class):* {
            var ret:*;
            switch (describeType(to).factory.constructor.parameter.(@optional == "false").length()) {
                case 0: ret = new to(); break;
                case 1: ret = new to(null); break;
                case 2: ret = new to(null, null); break;
                case 3: ret = new to(null, null, null); break;
                case 4: ret = new to(null, null, null, null); break;
                case 5: ret = new to(null, null, null, null, null); break;
                case 6: ret = new to(null, null, null, null, null, null); break;
                case 7: ret = new to(null, null, null, null, null, null, null); break;
                case 8: ret = new to(null, null, null, null, null, null, null, null); break;
                case 9: ret = new to(null, null, null, null, null, null, null, null, null); break;          
                default: throw new Error("no implementation for instantiating classes that require more than 9 constructor arguments");
            }
            return ret;
        }
        public static function castAnonymous(obj:Object, to:Class):* {
            var ret = createInstance(obj);
            for (var name:String in obj)
                try {
                    ret[name] = obj[name];
                }
                catch (e:Error) {
                    throw new Error("error trying to assign value " + obj[name] + " to property " + name + " on " + ret + ". reason: " + e);
                }
            return ret;
        }               
    }   
}

限制:

    如果你的类恐慌,如果在构造时使用空值发送垃圾邮件,或者构造函数需要超过9个参数,则
  1. 将失败
  2. 没有,也无法递归,因此它可能只是将匿名对象或数组分配给返回的实例的属性
  3. 希望它无论如何都有帮助;)

    格尔茨

    back2dos

答案 2 :(得分:2)

实际上 - 您可以使用内置解析器并覆盖JSON.parse方法并利用匿名函数的范围访问父函数中的对象来解决此限制。

例如 - 查看此代码段

public dynamic class MutatorData extends Object
{
    public var DisplayName:String;
    public var PropertyName:String;
}

public function parseData( data:String )
{
    var mutator:MutatorData = new MutatorData();

    JSON.parse( data,
        function (k, v) {
        mutator[k] = v;
        });
}

使用代码示例原样 - MutatorData类必须声明为动态,ALMOST失败了为它创建类的目的。您将无法阻止其他编码器向其添加属性,JSON字符串中的拼写错误将成为对象的属性。 Evenso,您将在IDE中获得一些RTTI和代码提示 - 这有助于防止编码器错误。

但是编写一个可以与最终(非动态)类一起使用的parse方法的自定义版本是一件简单的事情。

在我目前正在研究的项目上 - 内存和运行时性能至关重要,我们更喜欢使用自定义解析器,原因如下:

1)它允许我们在一开始就改变严格类型的对象,并放弃将数据复制到临时通用对象中。

2)我们可以将验证器构建到解析器中,根据需要抛出运行时错误,以通知程序我们收到错误的JSON数据。

答案 3 :(得分:2)

有一种方法

as3-vanilla lib on github,非常好:))

https://github.com/jonnyreeves/as3-vanilla

答案 4 :(得分:0)

您无法从动态对象强制转换自定义对象。 但是你可以从as3corelib扩展JSON-Decoder。我之所以这么做是因为这个原因。当我解码json-String时,我传递了编码对象的类名。通过稍微使用反射,您可以获得强大的自定义对象。当然,您需要在解码之前知道编码对象的类名...