Как с помощью Ktor десериализовать ответы JSON со списками разных типов?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как с помощью Ktor десериализовать ответы JSON со списками разных типов?

Сообщение Anonymous »

Я работаю над приложением для Android, которое использует Ktor для HTTP-запросов к API. В зависимости от запроса ответ может содержать список одного из двух типов. Код работает, когда я определяю четыре класса данных: по одному для каждого типа ответа и два разных класса данных результатов — по одному для каждого типа результата. Однако я хотел бы знать, можно ли использовать только один класс данных ответа и указать ему, какой класс данных использовать для списка, когда я делаю HTTP-запрос.
Я использую библиотека сериализации Kotlin.
Классы выглядят следующим образом:

Код: Выделить всё

@Serializable
data class ResultOne(
val count: Int,
val result: List
)

@Serializable
data class ResultTwo(
val count: Int,
val result: List
)

@Serializable
data class TypeOne(
val str1: String,
val str2: String,
val int1: Int
)

@Serializable
data class TypeTwo(
val str1: String,
val dbl1: Double,
val int1: Int
)
А запрос выглядит примерно так:

Код: Выделить всё

...
import io.ktor.serialization.kotlinx.json.json
...

private val httpClient = HttpClient {
install(ContentNegotiation) {
json(Json{
isLenient = true
ignoreUnknownKeys = true
})
}
}

fun getResultTypeOne() {
val response = responseOne(listOf(1, 2)).result
}

private suspend fun responseOne(ints: List): ResultOne {
val availableShows = httpClient.get("https://my.api.com/search")
return availableShows.body()
}

fun getResultTypeTwo() {
val response = responseTwo(listOf(1, 2)).result
}

private suspend fun responseTwo(ints: List): ResultTwo {
val availableShows = httpClient.get("https://my.api.com/search")
return availableShows.body()
}
В HTTP-вызовах есть некоторая избыточность, поскольку они одинаковы, за исключением указания другого класса данных для разных типов результатов. Есть ли способ вместо этого повторно использовать один и тот же HTTP-вызов, но указать ему, какой тип результата следует ожидать в этом вызове?

Подробнее здесь: https://stackoverflow.com/questions/772 ... rent-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»