2017-07-26 5 views
3

GsonにカスタムJsonデシリアライザを登録するには?リストのためのKotlin Gsonカスタムデシリアライザ

Javaコードでデシリアライザを登録すると、すべて正常に動作しますが、KotlinをJavaに変換するとデシリアライザメソッドが呼び出されません。

Kotlinレジスタコード:

val listType: Type = object : TypeToken<List<Advert>>() {}.type 
val gson = GsonBuilder() 
      .registerTypeAdapter(listType, deserializer) 

val retrofit = Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create(gson)) 

Javaコード:

Type listType = new TypeToken<List<Advert>>() {}.getType(); 
Gson gson = new GsonBuilder() 
      .registerTypeAdapter(listType, deserializer) 

Retrofit retrofit = new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create(gson)) 

デシリアライザ宣言:

class AdvertsDeserializer : JsonDeserializer<List<Advert>> { 
override fun deserialize(json: JsonElement?, typeOfT: Type?, 
         context: JsonDeserializationContext?): List<Advert> { 

呼び出すメソッド

私が理解しているように、Jsonオブジェクト(listType)の型の問題、または私が間違っていることは何ですか?

答えて

5

問題は、KotlinコンパイラがListのワイルドカードを追加することです。 e。 List<CharSequense>List<? extends Charsequence>としてコンパイルされます。

ソリューションはMutableList

object : TypeToken<MutableList<Advert>>() {}.type 

または

object : TypeToken<List<@JvmSuppressWildcards Advert>>() {}.type 
+0

ワイルドカードをsupperssするために使用するために、それは私の問題を解決するためのおかげだされますか! –

関連する問題