Ошибка "обнаружен неизвестный ключ" при парсинге с kotlin serialization

Рейтинг: -1Ответов: 1Опубликовано: 23.05.2023

Я понимаю, как можно распарсить весь ответ сервера в json формате (создать для каждого принятого объекта свой data class отметить нужной аннотацией), но тут возникает вопрос, а что если мне не нужны все данные ответа, как быть тогда?

Читал документацию на библиотеку, знаю что есть такие аннотации, как @Option (насколько понял, что если сервер не дает такой ключ, то десериализация не происходит по нему просто и прила продолжает нормально работать) и @Transient (если правильно понял, то это игнорирование данных по этому ключу), но видимо я что-то не так делаю и у меня все равно крашится при парсинге.

Интересует roi, мне он не нужен и парсить я бы его не хотел в json ответе он выглядит так:

"roi": {
      "times": 89.41854186772676,
      "currency": "btc",
      "percentage": 8941.854186772676
    },
@Serializable
data class CoinModel(
    @SerialName("id")
    val id:String?,
    @SerialName("symbol")
    val symbol:String?,
    @SerialName("name")
    val name:String?,
    @SerialName("image")
    val imageUrl:String?,
    @SerialName("current_price")
    val currentPrice:Double?,
    @SerialName("market_cap")
    val marketCap:Long?,
    @SerialName("market_cap_rank")
    val marketCapRank:Int?,
    @SerialName("fully_diluted_valuation")
    val fullyDilutedValuation:Double?,
    @SerialName("total_volume")
    val totalVolume:Double?,
    @SerialName("high_24h")
    val high24h:Double?,
    @SerialName("low_24h")
    val low24h:Double?,
    @SerialName("price_change_24h")
    val priceChange24h:Double?,
    @SerialName("price_change_percentage_24h")
    val priceChangePercentage24h:Double?,
    @SerialName("market_cap_change_24h")
    val marketCapChange24h:Double?,
    @SerialName("market_cap_change_percentage_24h")
    val marketCapChangePercentage24h:Double?,
    @SerialName("circulating_supply")
    val circulatingSupply:Double?,
    @SerialName("total_supply")
    val totalSupply:Double?,
    @SerialName("max_supply")
    val maxSupply:Double?,
    @SerialName("ath")
    val ath:Double?,
    @SerialName("ath_change_percentage")
    val athChangePercentage:Double?,
    @SerialName("ath_date")
    val ath_date:String?,
    @SerialName("atl")
    val atl:Double?,
    @SerialName("atl_change_percentage")
    val atlChangePercentage:Double?,
    @SerialName("atl_date")
    val atlDate:String?,
`
    @SerialName("roi")
    @Transient
    val roi: String? = null,
`
    @SerialName("last_updated")
    val last_updated:String?
    )

Забыл отметить, вылетает ошибка: обнаружен неизвестный ключ "roi"

Ответы

▲ 2

Решил проблему следующим образом: В классе где происходит сборка ретрофита (ну там Retrofit.Builder()...) при добавлении фабрики конвертации (метод .addConverFactory) при создании Json объекта в теле изменил свойство ignoreUnknownKeys на true и выглядит ретрофит таким образом:

private val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(Json{ignoreUnknownKeys = true}.asConverterFactory("json/application".toMediaType()))
        .build()

ссылку на часть документации тоже прикладываю:

https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md#ignoring-unknown-keys

Надеюсь этот вопрос попадется на глаза какому-нибудь опытному человеку и он даст оценку такому решению проблемы :) Буду очень признателен