Не удается десериализовать общий тип T Moshi

Извините, если это основной вопрос, но я новичок в Моши.

Итак, у меня есть класс с параметром универсального типа следующим образом:

class BaseResponse<T> {
   @Json(name = "message")
   var message: String? = null
   @Json(name = "data")
   var data: T? = null
   @Json(name = "meta")
   var meta: JsonObject? = null
   @Json(name = "error")
   var error: ErrorResponse? = null
}

В GSON это делается автоматически и работает до тех пор, пока я предоставляю @SerializedName («данные») и расширяю BaseResponse в моем методе модификации. Но он возвращает ошибку с моши, так как я не смог десериализовать BaseResponse. Как я могу это исправить?


person Kevin Gozali    schedule 26.03.2020    source источник
comment
Вам нужно будет создать адаптер моши, чтобы сделать это преобразование для вас.   -  person Jeel Vankhede    schedule 26.03.2020
comment
Спасибо за ваш ответ, как я могу создать этот адаптер? мне нужно создать адаптер для каждого класса?   -  person Kevin Gozali    schedule 26.03.2020


Ответы (2)


В Moshi вы должны явно объявить свои аннотации как аннотации полей, например @field:Json(name = "message")

person 92AlanC    schedule 26.03.2020
comment
спасибо за ваш ответ, отличается ли @field:Json(name = data) от @Json(name = data)? - person Kevin Gozali; 26.03.2020
comment
Да, в некотором роде. @field:Json = @Json, но @Json != @field:Json. См. kotlinlang.org/docs/reference/ ( Использование аннотации - цели сайта) Пожалуйста, не забудьте принять ответ, если он решит вашу проблему - person 92AlanC; 26.03.2020

И базовый класс, и класс, заменяющий универсальный тип в коде, должны быть снабжены аннотацией @JsonClass(generateAdapter = true). Обратите внимание, что самое главное для правильного преобразования json в класс модели, такой как этот, — это объявить поля в базовом классе как var, а НЕ как val. Пожалуйста, посмотрите пример ниже:

 @JsonClass(generateAdapter = true)
 class BaseResponse<T> {

   @Json(name = "message")
   var message: String? = null
   @Json(name = "data")
   var data: T? = null
   @Json(name = "meta")
   var meta: JsonObject? = null
   @Json(name = "error")
   var error: ErrorResponse? = null
}

Пример API:

@GET("api/info")
suspend fun getInfo(): BaseResponse<Info>

Информация:

@JsonClass(generateAdapter = true)
data class Info(
    val language: String? = null,
    val profile: Profile? = null
)
person Nikos M    schedule 31.05.2021