【问题标题】:Kotlin Gson custom deserializer for list列表的 Kotlin Gson 自定义反序列化器
【发布时间】:2018-01-01 19:57:42
【问题描述】:

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

当我在 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> {

方法调用

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

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

【问题讨论】:

    标签: java android json gson kotlin


    【解决方案1】:

    问题在于 Kotlin 编译器将 List 视为协变泛型类型 List&lt;out T&gt; 并将其实例化编译为通配符类型,即。 e. List&lt;CharSequence&gt; 编译为 List&lt;? extends Charsequence&gt;

    解决方案是使用MutableList,这是不可行的

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

    或支持通配符生成

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

    更多信息:Kotlin Generics. Variance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多