0

我一直在尝试解决这个棘手的问题,但无法找到一个好的方法。

所以我有一个 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 中的类结构,从而以这些语言创建库。因此,我正在寻找可以一次性指定所有详细信息的东西,因此我不必单独监视所有单独的库代码。

4

2 回答 2

3

可能Apache Thrift会有用。它有自己的 *.thrift 格式来描述数据结构,并且默认支持很多语言,甚至更多的社区。

于 2013-02-07T08:28:10.983 回答
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;
 }
于 2013-02-07T08:18:17.723 回答