我如何使用 Ktor 解析响应
How do I parse a response with Ktor
我正在尝试在多平台项目中使用 Ktor 进行 Get 调用。这是代码:
private val client = HttpClient()
fun myCall(callback: (List<Film>) -> Unit) {
viewModelScope.launch {
val result:List<Film> = client.get {
url("https://data.sfgov.org/resource/wwmu-gmzc.json")
}
callback(result)
}
}
每次我提出这个请求时,应用程序都会关闭,而且我没有收到任何消息来告诉我发生了什么。如果我没有将 Film 列表作为结果类型,而是将 String 作为结果类型,那么它可以工作并且我收到了一个电影列表,但我想将它解析为我自己的对象,但我做不到。
通话有问题吗?
对于 Ktor http 客户端 反序列化为您的自定义对象,您需要在创建您的对象时安装 JsonFeature
http 客户端,需要添加 io.ktor:ktor-client-json
依赖项。
val client = HttpClient {
install(JsonFeature)
}
然后取决于你想使用哪个序列化器(Ktor 支持 Gson、Jackson 和 Kotlinx.Serialization),需要添加各自序列化器的依赖。例如,如果你想使用Gson
,你需要添加对io.ktor:ktor-client-gson
的依赖。然后你的 API 响应将被反序列化为你的 List<Film>
对象。
val result: List<Film> = client.get {
url("https://data.sfgov.org/resource/wwmu-gmzc.json")
}
Ktor 中的更多内容 documentation
对于您的 result
,您也可以尝试使用 HttpResponse
作为类型。
而且我认为,您仍然必须明确使用库(例如 Gson
)来解析 api-响应,例如
val result: HttpResponse = client.get("https://data.sfgov.org/resource/wwmu-gmzc.json")
val parsedResponseBody = Gson().fromJson(result.readText(), Films::class.java)
readText()
是 HttpResponse
的扩展函数,returns 内容(响应主体)作为字符串。
您的数据 class 应该看起来像:
data class Films(val films: List<Film>) {
data class Film(*...*)
}
我正在尝试在多平台项目中使用 Ktor 进行 Get 调用。这是代码:
private val client = HttpClient()
fun myCall(callback: (List<Film>) -> Unit) {
viewModelScope.launch {
val result:List<Film> = client.get {
url("https://data.sfgov.org/resource/wwmu-gmzc.json")
}
callback(result)
}
}
每次我提出这个请求时,应用程序都会关闭,而且我没有收到任何消息来告诉我发生了什么。如果我没有将 Film 列表作为结果类型,而是将 String 作为结果类型,那么它可以工作并且我收到了一个电影列表,但我想将它解析为我自己的对象,但我做不到。
通话有问题吗?
对于 Ktor http 客户端 反序列化为您的自定义对象,您需要在创建您的对象时安装 JsonFeature
http 客户端,需要添加 io.ktor:ktor-client-json
依赖项。
val client = HttpClient {
install(JsonFeature)
}
然后取决于你想使用哪个序列化器(Ktor 支持 Gson、Jackson 和 Kotlinx.Serialization),需要添加各自序列化器的依赖。例如,如果你想使用Gson
,你需要添加对io.ktor:ktor-client-gson
的依赖。然后你的 API 响应将被反序列化为你的 List<Film>
对象。
val result: List<Film> = client.get {
url("https://data.sfgov.org/resource/wwmu-gmzc.json")
}
Ktor 中的更多内容 documentation
对于您的 result
,您也可以尝试使用 HttpResponse
作为类型。
而且我认为,您仍然必须明确使用库(例如 Gson
)来解析 api-响应,例如
val result: HttpResponse = client.get("https://data.sfgov.org/resource/wwmu-gmzc.json")
val parsedResponseBody = Gson().fromJson(result.readText(), Films::class.java)
readText()
是 HttpResponse
的扩展函数,returns 内容(响应主体)作为字符串。
您的数据 class 应该看起来像:
data class Films(val films: List<Film>) {
data class Film(*...*)
}