Moshi 1.9.1 no puede serializar el tipo Kotlin


12

Tengo un código de trabajo que serializa / deserializa datos usando Moshi 1.8.0

La actualización a 1.9.1 ahora conduce a un bloqueo al intentar serializar:

java.lang.IllegalArgumentException: no se puede serializar el tipo Kotlin com.xxx.Spot. La serialización reflexiva de las clases de Kotlin sin usar kotlin-reflect tiene un comportamiento indefinido e inesperado. Utilice KotlinJsonAdapter del artefacto moshi-kotlin o use code gen del artefacto moshi-kotlin-codegen.

Aquí está el código de serializador:

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)

y la clase T correspondiente es

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

No tengo ni idea de qué hacer aquí.

¡Gracias por la ayuda!


nos muestran las dependencias que está utilizando
coroutineDispatcher

Respuestas:


14

Debe agregar @JsonClass (generateAdapter = true) antes de su clase de datos

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

2
¿Por qué es eso necesario?
Morten Holmgaard el

55
... e incluya la configuración kapt correspondiente en su compilación. Detalles aquí: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson el

1
Gracias, funcionó! Agregar @JsonClass (generateAdapter = true) + cambiar la implementación de gradle de 'moshi' a 'moshi-kotlin' + kapt hizo el truco
lorenzo

0

Puede suprimir los comodines usando @JvmSuppressWildcards.

Me gusta esto

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.