Ktor (gson) возвращает LinkedTreeMap вместо указаного data class
data class Response<T>(
val ok: Boolean,
val result: T?,
@SerializedName("error_code") val errorCode: Int?,
val description: String?,
val parameters: ResponseParameters?
)
data class ResponseParameters(
@SerializedName("retry_after") val retryAfter: Int? = null
)
data class User(
val id: Int,
@SerializedName("is_bot") val isBot: Boolean,
@SerializedName("first_name") val firstName: String,
@SerializedName("last_name") val lastName: String?,
val username: String?,
@SerializedName("language_code") val languageCode: String?,
@SerializedName("can_join_groups") val canJoinGroups: Boolean?,
@SerializedName("can_read_all_group_messages") val canReadAllGroupMessages: Boolean?,
@SerializedName("supports_inline_queries") val supportsInlineQueries: Boolean?
)
class Api(private val token: String) {
val gson = Gson()
private val httpClient = HttpClient(CIO) {
expectSuccess = false
install(JsonFeature) {
serializer = GsonSerializer()
}
}
private suspend inline fun <reified T> request(vararg params: Pair<String, Any?>): T {
val response = httpClient.post<Response<T>> {
url("https://api.telegram.org/bot${token}/")
body = MultiPartFormDataContent(
formData {
params.forEach { (key, value) ->
when(value) {
null -> {}
is Int -> append(key, value)
is String -> append(key, value)
is Float -> append(key, value)
else -> append(key, gson.toJson(value))
}
}
}
)
}
if (!response.ok) {
when (response.errorCode) {
401 -> throw UnauthorizedException(response.description!!)
409 -> throw ConflictException(response.description!!)
429 -> throw TooManyRequestsException(response.description!!, response.parameters!!.retryAfter!!)
else -> throw TelegramException(response.description!!)
}
}
return response.result!!
}
suspend fun getMe(): User {
return request<User>(
"method" to "getMe"
)
}
}
При вызове getMe выдает ошибку:
com.google.gson.internal.LinkedTreeMap cannot be cast to User
По какой-то причини в Response<T> T не является User.
Пробовал KotlinxSerializer, с ним работает как надо, но он не подходит. Так же пробовал Jackson, он работает как Gson.
Как заставить воспринимать класс правильно? Или может есть какой-нибудь другой вариант?