6

Gsonを使用して、ネストされたジェネリッククラスを逆シリアル化しようとしています。クラス構造は次のようになります。

ラッパーオブジェクト。簡略化されていますが、通常は、などの他のプロパティを保持します。これらのプロパティは、サーバーから-fieldstatusMessageとともに返されます。data

public class Response<T> {

   private List<T> data = null;

   public List<T> getData() { return this.data; }   

}

単純なクラス、data上記の-fieldからの期待される出力(配列として):

public class Language {
   public String alias;
   public String label;
}

使用法:

Type type = new TypeToken<Response<Language>>() {}.getType();
Response<Language> response = new Gson().fromJson(json, type);
List<Language> languages = response.getData();
Language l = languages.get(0);
System.out.println(l.alias); // Error occurs here

ここで、json-variableは次のようなものです。

ただし、これを行うと、次の例外が発生します(3行目、最後のコード例)。

ClassCastException:com.google.gson.internal.StringMapをbook.Languageにキャストできません

例外は、からのデータをgetData()変数に格納する場合(または1つとして使用する場合)にのみ発生します。

どんな助けでも大歓迎です。

4

1 に答える 1

8

あなたが実際に抱えている問題は、直接Gsonの原因ではなく、配列とジェネリックがどのように連携するかが原因です。

new T[10]あなたのようなクラスでは実際にはできないことに気付くでしょう。参照: Java でジェネリック配列を作成する方法

基本的に次の 2 つのオプションがあります。

  1. 上でリンクしたSOの質問に示されているように、カスタムデシリアライザーを作成し、T[]そこに配列を構築します
  2. List<T>代わりにaを使用すると、単純に機能します。本当に配列を返す必要がある場合は、いつでもList.toArray()メソッドを呼び出すことができます。

以下のコメントから編集:

これは完全に機能する例です:

public class App 
{
    public static void main( String[] args )
    {
        String json = "{\"data\": [{\"alias\": \"be\",\"label\": \"vitryska\"},{\"alias\": \"vi\",\"label\": \"vietnamesiska\"},{\"alias\": \"hu\",\"label\": \"ungerska\"},{\"alias\": \"uk\",\"label\": \"ukrainska\"}]}";
        Type type = new TypeToken<Response<Language>>(){}.getType();
        Response<Language> resp = new Gson().fromJson(json, type);

        Language l = resp.getData().get(0);
        System.out.println(l.alias);

    }
}

class Response<T> {

   private List<T> data = null;

   public List<T> getData() { return this.data; }   

}

class Language {
   public String alias;
   public String label;
}

出力:

なれ

于 2013-01-23T21:32:19.097 に答える