Moshi 1.9.1无法序列化Kotlin类型

时间:2019-11-01 13:51:04

标签: android kotlin moshi

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

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

  

java.lang.IllegalArgumentException:无法序列化Kotlin类型   com.xxx.Spot。不带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
)

我对在这里做什么一无所知。

感谢您的帮助!

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

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

所述

答案 2 :(得分:0)

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

像这样

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