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 のインスタンスではなく、オブジェクトを返します。したがって、この JSON 文字列を使用すると、Object 型の「fruit_color」フィールドを持つオブジェクトを受け取ります。これには、String 型の 3 つのフィールドがあります。たとえば、この「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 に答える