Адаптер Moshi для аннотированной модели

В настоящее время я использую адаптер Moshi для преобразования некоторых JSON RAW для данного типа. Работает нормально, пока я не использовал аннотированную модель.

Я предполагаю, что я должен добавить еще один параметр для моего адаптера рядом Player::class.java но я не знаю что.

Вот пример:

data class Player(
    val username: String,
    @Json(name = "lucky number")
    val luckyNumber: Int
)

private val playerStubRaw = "{\n" +
    "  \"username\": \"jesse\",\n" +
    "  \"lucky number\": 32\n" +
    "}"

@Test
fun doSomething() {
    val moshi = Moshi.Builder().build()
    val player = moshi.adapter(Player::class.java).fromJson(playerStubRaw)
    // player.luckyNumber == 0
}

luckyNumber значение 0, а не 32.

Любая идея, что я должен сделать, чтобы это работало?

Заранее спасибо,

1 ответ

Решение

Для работы с Kotlin Моши требуется либо отражающий KotlinJsonAdapterFactory (из артефакта moshi-kotlin), либо адаптеры code-gen (из артефакта moshi-kotlin-codegen). https://github.com/square/moshi
В будущем выпуске Moshi будет выдана соответствующая ошибка, чтобы заявить об этом требовании.

С артефактом moshi-kotlin-codegen вам также необходимо добавить @JsonClass(generateAdapter = true) в класс, чтобы декодирование работало правильно, и для свойства не было установлено значение по умолчанию 0

Итак, после добавления плагина kotlin-kapt и зависимости kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0" чтобы сборка приложения Gradle аннотировать класс, как показано ниже:

@JsonClass(generateAdapter = true)
data class Player(
    val username: String,
    @Json(name = "lucky number")
    val luckyNumber: Int
)
Другие вопросы по тегам