2011-01-03 4 views
1

Gsonを使用してフィールドを初期化しようとしましたが、成功しません。Gsonを使用したJSONからのクラスのフィールドの初期化

TasksHolder th = gson.fromJson(complex, TasksHolder.class); 

TaskHolderクラス::であることをやろうとし

String complex = "{'menu': { 'id': 'file', 'value': 'File', 'popup': { 'task': 
    [ {'value': 'New', 'onclick': 'CreateNewDoc()'}, {'value': 'Open', 'onclick': 'OpenDoc()'}, {'value': 'Close', 'onclick': 'CloseDoc()'}] 
}}}"; 

public class TasksHolder { 

    List<Task> task; 

    public TasksHolder() { 
     task = new ArrayList<Task>(); 
    } 
} 

TaskHoldertaskが満たされるようにするために何ができるかをアドバイスしてください。

答えて

3

問題は汎用タイプの消去です。 GSONには、あなたのクラスにListのみが含まれているために作成するオブジェクトの種類はありません(Taskに関する型情報は失われています)。ここで

how to deal with this problem in GSONです:

Type listType = new TypeToken<List<Task>>() {}.getType(); 
List<Task> tasks = gson.fromJson(myTasks, listType); 

しかし、あなたは親オブジェクトだけではなく、リストをしたいので、それは、あなたを助けにはなりません。 write your own Custom Serialization and Deserialization methods

+0

私にとって最も重要な部分はこれらのタスクのデータだと思うので、情報のおかげでうまくいくはずです。 – Eugene

+0

@AndroidNoobありがとうございます、アップホルダーはより良いです –

+0

私は例外がありますが、原因:java.lang.IllegalStateException:これはJSON配列ではありません。 – Eugene

0

JSONが定義したクラスにマップされていない:レベルのカップル(メニューレベルのプロパティを持つメインレベルのオブジェクト、次に実際にTaskHolderを含むメニューオブジェクト)が不足しています。 JSONがマップするクラス構造を定義するか(Gsonはどこにマップするかを知っていますか?)、必要のないものをJSONで事前処理して不要なものを削除してください。

他の回答に記載されている型消去は、あなたの 'task'プロパティはListとして宣言されており、Gsonがジェネリック型を決定するのに十分なはずです。はい、フィールド宣言はジェネリック型情報を保持します;型消去はClass経由で利用できるランタイム情報だから、型参照オブジェクトはルートtyに必要ですがそれらはルートプロパティのプロパティには必要ありません。