1

Gsonを使用してフィールドを初期化しようとしていますが、成功しません。

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

それをしようとしています:

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

TaskHolderクラス:

public class TasksHolder {

    List<Task> task;

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

埋めるためtaskに何ができるかアドバイスしてください。TaskHolder

4

2 に答える 2

3

問題は Generic Type Erasure です。GSON には、作成するオブジェクトの種類がわかりません。これは、クラスに List しか含まれていないためです (型情報Taskが失われます)。

GSONでこの問題を処理する方法は次のとおりです。

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

しかし、リストだけでなく親オブジェクトが必要なので、それは役に立ちません。残念ながら、独自のカスタム シリアライゼーションおよびデシリアライゼーション メソッドを作成する必要があります。

于 2011-01-03T15:35:06.547 に答える
0

JSON は、定義したクラスにマップされません: いくつかのレベル (「メニュー」プロパティを持つメインレベル オブジェクト、次に実際に TaskHolder を含むメニュー オブジェクト) が欠落しています。したがって、JSON がマップするクラス構造を定義する必要があります (他の方法Gson は何をどこにマッピングすればよいかを知っているでしょうか?)、または JSON を前処理して不要なものを削除します。

他の回答で言及されている型消去は、ここでは問題になりません。「タスク」プロパティは List として宣言されており、Gson がジェネリック型を決定するのに十分なはずです。はい、フィールド宣言はジェネリック型情報を保持します。タイプ消去は、クラスを介して利用可能なランタイム情報とより関係があります。したがって、ルート型には型参照オブジェクトが必要ですが、ルート プロパティの下のプロパティには必要ありません。

于 2011-01-04T18:37:43.683 に答える