【问题标题】:Moshi 1.9.1 Cannot serialize Kotlin typeMoshi 1.9.1 无法序列化 Kotlin 类型
【发布时间】:2020-02-27 19:37:44
【问题描述】:

我有一个使用 Moshi 1.8.0 序列化/反序列化数据的工作代码

现在升级到 1.9.1 会导致尝试序列化时崩溃:

java.lang.IllegalArgumentException:无法序列化 Kotlin 类型 com.xxx.现货。 Kotlin 类的反射序列化没有 使用 kotlin-reflect 具有未定义和意外的行为。请用 来自 moshi-kotlin 工件的 KotlinJsonAdapter 或使用来自 moshi-kotlin-codegen 工件。

这是序列化程序代码:

val moshi = Moshi.Builder().build()
val dataListType = newParameterizedType(List::class.java, T::class.java)
val adapter: JsonAdapter<List<T>> = moshi.adapter(dataListType)
val json = adapter.toJson(dataList)

而对应的T类是

@IgnoreExtraProperties
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

我完全不知道在这里做什么。

感谢您的帮助!

【问题讨论】:

  • 向我们展示你正在使用的依赖项

标签: android kotlin moshi


【解决方案1】:

您需要在数据类之前添加@JsonClass(generateAdapter = true)

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)

【讨论】:

  • 为什么需要这样做?
  • ... 并在您的构建中包含相应的 kapt 配置。详情在这里:github.com/square/moshi/blob/master/README.md#kotlin
  • 谢谢,成功了!添加 @JsonClass(generateAdapter = true) + 将 gradle 实现从 'moshi' 更改为 'moshi-kotlin' + kapt 成功了
  • 即使在使用 JsonClass 注解并尝试了反射方法(moshi-kotlin gradle 实现)和 codegen 方法后,Moshi 仍然抛出“无法序列化”运行时异常。即使在进行这些更改之后,还有其他人遇到过问题吗?
  • @Cody - 你想序列化的类中有枚举吗?
【解决方案2】:

您可以使用@JvmSuppressWildcards 禁止通配符。

喜欢这个

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)

【讨论】:

    【解决方案3】:

    如果您不想为所有数据类添加 @JsonClass 注解,另一个选择是将 KotlinJsonAdapterFactory 添加到 Moshi Builder。

    Moshi.Builder()
        .addLast(KotlinJsonAdapterFactory())
        .build()
    

    这使用反射,您需要向com.squareup.moshi:moshi-kotlin 添加依赖项,如https://github.com/square/moshi#kotlin 此处所述

    【讨论】:

    【解决方案4】:

    你应该添加这个注释

    @JsonClass(generateAdapter = true) 
    

    把你的数据类变成这样

    @JsonClass(generateAdapter = true) 
    data class Spot(
            var id: String = "",
            var localizedName: String? = null,
            var type: String = "",
            var location: Location? = null
         )
    

    然后您可以使用Moshi kotlin extensions 像这样反序列化您的 json 数组:

    val Spots: List<Spot>? = yourJson.deserializeList()
    

    【讨论】:

      猜你喜欢
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 2021-07-09
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多