2013-02-07 23 views
0

我一直在试图解决这个棘手的问题,但无法找到一个好的方法。从JSON文件创建动态ActionScript对象

所以我有一个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

嗯,这是可能的,但JSON解析器不会返回给你一个FruitColor的实例,而是一个Object。因此,使用此JSON字符串,您将收到一个Object类型为“fruit_color”的对象,该对象又将具有三个字符串类型的字段。说,这“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对象模板,希望构造,将提供必要的值,你需要一个类似于这样的方法:

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; 
} 
+1

我猜@ishan希望通过JSON源由某些自动工具从模板(以及其他语言)创建* .as类,而不是将json对象解析为手动创建的类。 – fsbmain

+0

嗯。我想这也是可能的,人们可以制作一个以“public class Blahblah”开头的模板,用解析的JSON对象的相应类型(使用Number而不是int,tho)列出所有变量,并编写一个像' loadFrom()'将填充提供的对象的值。但是,该* .as文件不会立即编译。 – Vesper

+0

im查看的json字符串就像一个线框并且没有实际的值。所以,如果我必须做fc.apple = ob.apple,那么它就没有多大意义,因为我将创建FruitColor类。我想要的是使用json创建类,以便能够执行诸如ob.apple =“red”之类的内容;这可能吗? – ishan

3

可能是Apache Thrift将是有用的。它具有自己的* .thrift格式来描述数据结构,默认情况下支持很多语言,甚至可以由社区支持。

+0

谢谢@fsbmain,这是非常接近我正在寻找 – ishan

+0

我发现[协议缓冲区](https://code.google.com/p/protobuf/),谷歌这是一个非常接近的工具 – ishan

+0

是的,protobuff是Google的另一种选择。我对AS3有着积极的经验,所以我提到了它,但protobuff也不是很好的变种。 – fsbmain