【问题标题】:How to parse response with jackson using ktor?如何使用 ktor 解析杰克逊的响应?
【发布时间】:2021-12-31 09:58:39
【问题描述】:

我有这个依赖:

implementation("io.ktor:ktor-server-core:$ktor_version")
implementation("io.ktor:ktor-jackson:$ktor_version")
implementation("io.ktor:ktor-server-netty:$ktor_version")
implementation("ch.qos.logback:logback-classic:$logback_version")
implementation("io.ktor:ktor-client-cio:$ktor_version")
implementation("io.ktor:ktor-client-json:$ktor_version")

还有ktor服务器的这个设置:

fun Application.configureHTTP() {
    install(DefaultHeaders)
    install(CallLogging)
    install(AutoHeadResponse)
    install(Routing)
    install(ContentNegotiation) {
        register(ContentType.Application.Json, JacksonConverter())
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
            disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            writerWithDefaultPrettyPrinter()
        }
    }
    install(CORS) {
        method(HttpMethod.Options)
        method(HttpMethod.Put)
        method(HttpMethod.Delete)
        method(HttpMethod.Patch)
        header(HttpHeaders.Authorization)
        header("MyCustomHeader")
//        allowCredentials = true
        anyHost() // @TODO: Don't do this in production if possible. Try to limit it.
    }

}

我想得到关于 Chuck Norris 的笑话,所以我做了这个data classes

data class ChuckNorrisJoke(
    val type: String,
    val value: Map<Any, Any>
)

data class JokeContent(
    val id: Long,
    val joke: String,
    val categories: List<String>
)

最后这就是我开玩笑的功能:

val client = HttpClient(CIO) {
    install(JsonFeature)
}
suspend fun getChuckNorrisJoke(): ChuckNorrisJoke {
    return client
        .get("http://api.icndb.com/jokes/random")
}

当我调用该方法时,我得到这个错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalStateException: Fail to find serializer. Consider to add one of the following dependencies: 
 - ktor-client-gson
 - ktor-client-json
 - ktor-client-serialization
    at io.ktor.client.features.json.DefaultJvmKt.defaultSerializer(DefaultJvm.kt:14)
    at io.ktor.client.features.json.JsonFeature$Feature.prepare(JsonFeature.kt:130)
    at io.ktor.client.features.json.JsonFeature$Feature.prepare(JsonFeature.kt:125)
    at io.ktor.client.HttpClientConfig$install$3.invoke(HttpClientConfig.kt:77)
    at io.ktor.client.HttpClientConfig$install$3.invoke(HttpClientConfig.kt:74)
    at io.ktor.client.HttpClientConfig.install(HttpClientConfig.kt:97)
    at io.ktor.client.HttpClient.<init>(HttpClient.kt:172)
    at io.ktor.client.HttpClient.<init>(HttpClient.kt:81)
    at io.ktor.client.HttpClientKt.HttpClient(HttpClient.kt:43)
    at com.example.ApplicationKt.<clinit>(Application.kt:109)

不明白如何正确设置HttpClient

【问题讨论】:

    标签: kotlin jackson ktor


    【解决方案1】:

    implementation("io.ktor:ktor-jackson:$ktor_version") 依赖声明用于服务器。您需要为 client 声明一个:implementation "io.ktor:ktor-client-jackson:$ktor_version"。您可以找到更多信息here

    【讨论】:

    • 谢谢!我用ktor-client-jackson 和上帝帮助 (install(JsonFeature) { serializer = JacksonSerializer() }) 运行它。
    猜你喜欢
    • 2015-09-27
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2019-11-25
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多