Kotlin Gson自定义解串器列表

问题描述:

如何在Gson注册自定义Json解串器?Kotlin Gson自定义解串器列表

当我在java代码中注册反序列化程序时,所有工作都正常,但是当我将Kotlin转换为Java - 未调用的反序列化程序方法时。

科特林注册码:

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> { 

方法调用

// list is List<Advert> 
service.getAdverts() 
      .subscribe({ 
       list -> 
       viewState.showAdvertsList(list) 
      }, { 
       error -> 
       error.printStackTrace() 
      }) 

据我所知 - Json对象类型(listType)的问题,或者我做错了什么?

问题是Kotlin编译器为List增加了一个通配符,即i。即List<CharSequense>编译为List<? extends Charsequence>

的解决方法是,使用MutableList

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

或supperss通配符

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

谢谢,这是解决我的问题! –