Kotlin Gson定制解串器列表

时间:2017-07-26 13:04:52

标签: java android json gson kotlin

如何在Gson中注册自定义Json反序列化器?

当我在java代码中注册反序列化时,一切正常,但是当我将Kotlin转换为Java时 - 没有调用deserializer方法。

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

方法调用

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

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

1 个答案:

答案 0 :(得分:11)

问题在于Kotlin编译器将List视为协变泛型类型List<out T>,并将其实例化编译为通配符类型,i。即List<CharSequence>被编译为List<? extends Charsequence>

解决方案是要使用MutableList是不可靠的

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

或supperss通配符生成

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

更多信息:Kotlin Generics. Variance