Moshi 1.9.1 Impossibile serializzare il tipo di Kotlin


12

Ho un codice funzionante che serializza / deserializza i dati usando Moshi 1.8.0

L'aggiornamento a 1.9.1 ora causa un arresto anomalo quando si tenta di serializzare:

java.lang.IllegalArgumentException: impossibile serializzare il tipo Kotlin com.xxx.Spot. La serializzazione riflessiva delle classi di Kotlin senza l'utilizzo di kotlin-reflection ha un comportamento indefinito e inaspettato. Si prega di utilizzare KotlinJsonAdapter dal manufatto moshi-kotlin o utilizzare il codice gen dal manufatto moshi-kotlin-codegen.

Ecco il codice serializzatore:

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)

e la corrispondente classe T è

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

Sono totalmente all'oscuro di cosa fare qui.

Grazie per l'aiuto!


mostraci le dipendenze che stai usando
coroutineDispatcher

Risposte:


14

Devi aggiungere @JsonClass (generateAdapter = true) prima della tua classe di dati

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

2
Perché è necessario?
Morten Holmgaard,

5
... e includi la configurazione kapt corrispondente nella tua build. Dettagli qui: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson,

1
Grazie, ha funzionato! Aggiungendo @JsonClass (generateAdapter = true) + cambiando l'implementazione gradle da 'moshi' a 'moshi-kotlin' + kapt ha fatto il trucco
lorenzo

0

Puoi sopprimere i jolly usando @JvmSuppressWildcards.

come questo

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.