嗯,这是可能的,但是 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;
}