Моші 1.9.1 Неможливо серіалізувати тип Котліна


12

У мене є робочий код для серіалізації / десеріалізації даних за допомогою Moshi 1.8.0

Оновлення до 1.9.1 тепер призводить до збоїв при спробі серіалізації:

java.lang.IllegalArgumentException: Не вдається серіалізувати тип Котліна com.xxx.Spot. Відображаюча серіалізація класів Котліна без використання котлін-відображення має невизначене та несподіване поведінку. Будь ласка, використовуйте KotlinJsonAdapter з артефакту moshi-kotlin або використовуйте код коду від артефакту 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
)

Я абсолютно незрозумілий, що тут робити.

Дякую за допомогу!


показати нам залежності , які ви використовуєте
coroutineDispatcher

Відповіді:


14

Потрібно додати @JsonClass (generatorAdapter = true) перед класом даних

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

2
Для чого це потрібно?
Мортен

5
... і включіть відповідну конфігурацію kapt у свою збірку. Деталі тут: github.com/square/moshi/blob/master/README.md#kotlin
Джессі Вілсон

1
Спасибі, спрацювало! Додавання @JsonClass (createAdapter = true) + зміна реалізації gradle з 'moshi' на 'moshi-kotlin' + kapt зробила трюк
lorenzo

0

Ви можете придушити макіяж, використовуючи @JvmSuppressWildcards.

подобається це

val adapter: JsonAdapter<List<@JvmSuppressWildcards T>> = moshi.adapter(dataListType)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.