Игнорируйте свойство в moshi, если его значение отсутствует

#android #kotlin #moshi

Вопрос:

У меня есть следующее свойство в моем классе данных

 @Parcelize
@JsonClass(generateAdapter = true)
data class CatalogProduct(
    @Json(name = "recommended")
    val recommended: Int = 0
) : Parcelable
 

Я получаю следующую ошибку:

 Expected an int but was BOOLEAN at path $.products[0].recommended at $.products[0].recommended
 

Поскольку ответ, который я получаю от API, может не содержать это значение в качестве необязательного.

Следующее не покажет ошибку, если значение отсутствует.

 @Transient
@Json(name = "recommended")
val recommended: Int = 0
 

Однако, если ответ содержит это значение, то он всегда будет исключен

Если я сделаю свойство обнуляемым, как это, то ошибка появится снова:

 @Json(name = "recommended")
val recommended: Int? = 0
 

Как я могу рекомендовать, чтобы оно было проигнорировано, если в ответе нет значения, и не игнорировалось, если оно есть?

Я использую следующие зависимости и версию

 moshiVersion = '1.11.0'

implementation "com.squareup.moshi:moshi:$moshiVersion"
implementation 'com.serjltt.moshi:moshi-lazy-adapters:2.2'
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion"
implementation "com.squareup.retrofit2:converter-moshi:$retrofitVersion"
 

Ответ №1:

Игнорируйте свойство в moshi, если его значение отсутствует

В общем, я просто использую val propertyName: Type? , это прекрасно работает в моем проекте.

 @Json(name = "email") val email: String,
@Json(name = "userName") val userName: String?,
@Json(name = "isSignup") val isSignup: Boolean?,
...
 

Что касается вашего описания, почему бы не использовать Boolean? , потому что я проверил ошибку :

Ожидалось значение int, но оно было логическим по пути $.products[0].рекомендуется по адресу $.products[0].рекомендуется

Если я правильно понимаю, это означает, что типы не соответствуют друг другу. Сервер возвращается Boolean , но вы используете Int его в классе данных.

Как насчет этого?

 @Json(name = "recommended") val recommended: Boolean?