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. Как заставить воспринимать класс правильно? Или может есть какой-нибудь другой вариант?


Ответы (0 шт):