从JSON文件创建动态ActionScript对象

时间:2013-02-07 07:30:32

标签: json actionscript-3

我一直试图解决这个棘手的问题,但不能采取好的方法。

所以我有一个JSON字符串:

{
   "fruit_color":{
     "apple":"",
     "banana":"",
     "orange":""
   }
}

我想处理这个JSON来获取一个表示类的对象:

class FruitColor
{
    private var apple: String;
    private var banana: String;
    private var orange: String;

    public function FruitColor(apple: String, banana: String, orange: String)
    {
         this.apple=apple;
         this.banana=banana;
         this.orange=orange;
    }
}

这可能吗? 如果我使用JSON字符串并尝试从中创建代码会更好吗?

我需要这样做的原因是我需要使用某个JSON来创建ActionScript,Java,Objective C中的类结构,以便用这些语言创建库。所以我正在寻找一些可以指定所有细节的东西,所以我不必单独监控所有单独的库代码。

2 个答案:

答案 0 :(得分:3)

可能会Apache Thrift有用。它有自己的* .thrift格式,用于描述数据结构,默认情况下支持大量语言,社区支持更多语言。

答案 1 :(得分:2)

嗯,这是可能的,但是JSON解析器不会返回FruitColor的实例,而是返回Object。因此,使用此JSON字符串,您将收到一个对象,该对象具有Object类型的“fruit_color”字段,该字段又具有三个String类型的字段。比如,这个“fruit_color”实际上确定了完整的FruitColor实例,在这种情况下你可以这样做:

class FruitColor {
...
public function loadFrom(ob:Object):void {
     this.apple=ob.apple;
     this.banana=ob.banana;
     this.orange=ob.orange;
}
...
}

然后调用它,创建一个FruitColor的新实例,然后在loadFrom()中应用解析后的对象。或者,创建一个类似的静态函数,它将返回一个现成的FruitColor对象,如下所示:

public static function loadFrom(ob:Object):FruitColor {
     var fc:FruitColor=new FruitColor();
     fc.apple=ob.apple;
     fc.banana=ob.banana;
     fc.orange=ob.orange;
     return fc;
}

编辑:鉴于你想要一个JSON对象模板中的* .as文件,想要一个能提供必要值的构造函数,你需要一个类似的方法:

public function makeClassFromObject(ob:Object):String {
    var header:String;
    var footer:String="}\n}";
    var cr:String=""; // constructor header
    var props:String="";
    var crbody:String="";
    for (var k:String in ob) {
        var the_ob=ob[k];
        if (the_ob is Object) {
            header="package { public class "+k+"{\n";
            cr="public function "+k+"(";
            for (k in the_ob) {
                var v:*=the_ob[k];
                var tt:String="Object"; // the type
                if (v is String) tt="String"; else
                if (v is int) tt="Number"; else 
                if (v is Number) tt="Number"; else 
                if (v is Array) tt="Array";
                props+="private var "+k+": "+tt+";\n";
                if (cr.charAt(cr.length-1)!='(') cr+=',';
                cr+=k+":"+tt;
                crbody+="this."+k+"="+k+";\n";
            }
            cr+="){\n";
            crbody+="}";
        } else {
            throw new Error("A nested Object is required!");
        }
        break; // we need ONE field in ob
    }
    return header+props+cr+crbody+footer;
 }