我一直试图解决这个棘手的问题,但不能采取好的方法。
所以我有一个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中的类结构,以便用这些语言创建库。所以我正在寻找一些可以指定所有细节的东西,所以我不必单独监控所有单独的库代码。
答案 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;
}