Moshi 1.9.1 Cannot serialize Kotlin type

2020-08-09 10:18发布

I have a working code serializing/deserializing data using Moshi 1.8.0

Upgrading to 1.9.1 now leads to a crash when attempting to serialize:

java.lang.IllegalArgumentException: Cannot serialize Kotlin type com.xxx.Spot. Reflective serialization of Kotlin classes without using kotlin-reflect has undefined and unexpected behavior. Please use KotlinJsonAdapter from the moshi-kotlin artifact or use code gen from the moshi-kotlin-codegen artifact.

Here is the serializer code:

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)

and the corresponding T class is

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

I'm totally clueless about what to do here.

Thanks for the help!

3条回答
SAY GOODBYE
2楼-- · 2020-08-09 10:40

You need to add @JsonClass(generateAdapter = true) before your data class

@JsonClass(generateAdapter = true) 
data class Spot(
    var id: String = "",
    var localizedName: String? = null,
    var type: String = "",
    var location: Location? = null
)
查看更多
贪生不怕死
3楼-- · 2020-08-09 11:01

You can suppress wild cards using @JvmSuppressWildcards.

like this

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
查看更多
Melony?
4楼-- · 2020-08-09 11:03

The other option if you don't want to add @JsonClass annotations to all your data classes is to add KotlinJsonAdapterFactory to the Moshi Builder.

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

This uses reflection and you need to add the com.squareup.moshi:moshi-kotlin dependency as explained here https://github.com/square/moshi#kotlin

查看更多
登录 后发表回答