2016-09-29 11 views
2

からクラスをインスタンス化するためにダーツに私が正常より、Map toJson()方法を暴露することによってdat:convert「オプトイン」できるとJSON.encode(myClass)とJSON-ifiedことができるクラスを作成するために管理しました以下、次のように:使用JSON.decode()の周り参照してJSON文字列

//My dummy class 
class MyClass{ 
    String p1; 
    String p2; 

    Map toJson{ 
    return { 
     'p1':this.p1, 
     'p2':this.p2 
    } 
    } 
} 

//so I can do 
String jsonString = JSON.encode(myClass) 

しかし私は、周りにこれも、他の方法をしたいたい:

String jsonString = '{"p1":"value","p2":"value"}' 
MyClass instance = JSON.decode(jsonString) 

しかし、これまでのところ、私は方法を見つけることができなかったしました。 私は、のようなものマップからそれを初期化私のクラスのコンストラクタを構築することができます知っている:私はちょうどJSON.encode()とJSON.decodeを使用して、より「対称」方法を探していましたが

String jsonString = '{"p1":"value","p2":"value"}' 
MyClass instance = MyClass.fromMap(JSON.decode(jsonString)) 

を()、それは何とかできますか?何か不足していますか?

+0

何ちょうど隠れる程度'JSON.decode'をコンストラクタに入れていますか?(それは私の意見です)明示的にtoJson()を呼び出す方が良いです。 stacktraceには表示されません(なぜか分かりません)。 –

+1

hmmm、確かに可能でしたが、私の質問は、なぜJSON.encode()をtoJson()に公開し、それ以外の方法で公開することができないのかを知ることでした。 –

答えて

0

JSONでクラスをエンコードする標準的な方法はありません。 {"p1":"value","p2":"value"}には、どのクラスをインスタンス化するかに関する情報は含まれていません。文字列から新しいクラスを作成する標準的な方法もありません(複数のクラスに同じ名前のクラスが含まれている場合はどのライブラリを使用する必要がありますか...)

リビバーがその目的のために使用できることがわかっている限り

reviver(var key, var value) { 
    // decode manually 
} 
final jsonDecoder = new JsonDecoder(reviver); 

しかしリバイバーは、JSONは何ダートクラスとどのようにそれをインスタンス化し、JSONからプロパティを初期化する必要になるべきかを認識する方法をいくつかのハードコードのロジックを持っている必要があります。

関連する問題