Google Gsonを介してリストオブジェクトを転送したいのですが、ジェネリック型を逆シリアル化する方法がわかりません。
私は見ての後にしようとした何本(BalusCの答え):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
しかし、Eclipseで「type new List(){}は継承された抽象メソッドを実装する必要があります...」というエラーが発生し、クイックフィックスを使用すると、20を超えるメソッドスタブのモンスターが発生します。
私はもっと簡単な解決策があると確信していますが、それを見つけることができないようです!
編集:
今私が持っています
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
ただし、「fromJson」行で次の例外が発生します。
java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
私は JsonParseExceptionsをキャッチし、「結果」はnullではありません。
デバッガーでlistTypeをチェックし、次の情報を得ました。
- リストタイプ
- args = ListOfTypes
- リスト= null
- resolveTypes = Type [1]
- ローダー= PathClassLoader
- ownerType0 = null
- ownerTypeRes = null
- rawType = Class(java.util.ArrayList)
- rawTypeName = "java.util.ArrayList"
- args = ListOfTypes
そのため、「getClass」の呼び出しが適切に機能しなかったようです。助言がありますか...?
Edit2:Gson User Guideで確認しました。Jsonへのジェネリック型の解析中に発生するはずのランタイム例外について言及しています。例のように、「間違った」(上には表示されていません)ことを行いましたが、その例外はまったく発生しませんでした。だから私はユーザーガイドが示唆するようにシリアライゼーションを変更しました。しかし、助けにはならなかった。
Edit3:解決しました。以下の私の回答を参照してください。
TokenType
ます。その方法を試しましたか?