You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ktor 2.3.4因响应头Content-Type为text/html无法解析JSON求解决方案

解决Ktor解析Content-Type为text/html的JSON响应问题

针对你遇到的服务器返回JSON但Content-Type为text/html导致Ktor无法解析的问题,以下是几种可行的解决方案:

方案一:让Gson序列化器支持text/html类型

Ktor的ContentNegotiation默认只会让Gson处理application/json类型的响应,我们可以手动注册让Gson同时处理text/html类型,这样不管响应头是什么,只要内容是JSON就会被正确解析:

val client = HttpClient(OkHttp) {
    install(ContentNegotiation) {
        gson {
            register(ContentType.Text.Html, GsonConverter(this))
            register(ContentType.Application.Json, GsonConverter(this))
        }
    }
}

方案二:使用Ktor客户端拦截器修改响应头

你之前用OkHttp引擎的拦截器无效,是因为Ktor的ContentNegotiation处理流程在OkHttp引擎返回响应后,且Ktor的响应对象与OkHttp的响应对象是分离的,修改OkHttp层面的头无法被Ktor的解析流程感知。改用Ktor自带的响应拦截器,在ContentNegotiation处理前修改响应头:

val client = HttpClient(OkHttp) {
    install(ContentNegotiation) {
        gson()
    }

    intercept(HttpResponsePipeline.Receive) { context ->
        val modifiedHeaders = context.response.headers.toMap().toMutableMap().apply {
            this["Content-Type"] = listOf("application/json; charset=utf-8")
        }
        context.response = context.response.copy(headers = Headers(modifiedHeaders))
        proceed()
    }
}

方案三:手动解析响应体

如果上面两种方案都不适用,可以直接跳过Ktor的自动解析,手动获取响应文本后用Gson解析:

val client = HttpClient(OkHttp)
val responseText = client.get("你的API地址").bodyAsText()
val result = Gson().fromJson(responseText, YourTargetClass::class.java)

内容的提问来源于stack exchange,提问作者gokhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:22:25