Moshi 1.9.1 ne peut pas sérialiser le type Kotlin


12

J'ai un code de sérialisation / désérialisation de code de travail à l'aide de Moshi 1.8.0

La mise à niveau vers 1.9.1 entraîne désormais un crash lors de la tentative de sérialisation:

java.lang.IllegalArgumentException: impossible de sérialiser le type Kotlin com.xxx.Spot. La sérialisation réfléchie des classes Kotlin sans utiliser kotlin-reflect a un comportement indéfini et inattendu. Veuillez utiliser KotlinJsonAdapter de l'artefact moshi-kotlin ou utiliser le code gen de l'artefact moshi-kotlin-codegen.

Voici le code du sérialiseur:

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)

et la classe T correspondante est

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

Je ne sais absolument pas quoi faire ici.

Merci pour l'aide!


montrez-nous les dépendances que vous utilisez
coroutineDispatcher

Réponses:


14

Vous devez ajouter @JsonClass (generateAdapter = true) avant votre classe de données

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

2
Pourquoi est-ce nécessaire?
Morten Holmgaard

5
... et incluez la configuration kapt correspondante dans votre build. Détails ici: github.com/square/moshi/blob/master/README.md#kotlin
Jesse Wilson

1
Merci, ça a marché! Ajouter @JsonClass (generateAdapter = true) + changer l'implémentation gradle de 'moshi' en 'moshi-kotlin' + kapt a fait l'affaire
lorenzo

0

Vous pouvez supprimer les caractères génériques à l'aide de @JvmSuppressWildcards.

comme ça

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.