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

如何在Ktor WebSocket客户端中复用ContentNegotiation配置的JSON实例

解决方案

1. 获取ContentNegotiation中配置的Json实例

在WebSocket会话上下文里,你可以通过Ktor客户端实例直接提取已配置的ContentNegotiation插件,进而拿到其中的Json序列化器:

// 假设你的Ktor客户端实例为client
val contentNegotiation = client.plugin(ContentNegotiation)
val jsonSerializer = contentNegotiation.serializer(JsonContentConverter) as Json

2. 在WebSocket会话中复用该Json实例反序列化

处理WebSocket文本消息时,直接用上面获取的jsonSerializer替代原Retrofit的Json实例完成反序列化:

client.webSocketSession(url = "ws://your-websocket-endpoint") {
    incoming.consumeEach { frame ->
        if (frame is Frame.Text) {
            val messageText = frame.readText()
            // 使用ContentNegotiation配置的Json实例解析消息
            val targetModel = jsonSerializer.decodeFromString(YourTargetModel.serializer(), messageText)
            // 后续业务逻辑处理
        }
    }
}

3. 确认ContentNegotiation的Json配置有效性

确保你的Ktor客户端初始化时,ContentNegotiation插件已正确配置自定义Json规则,示例如下:

val client = HttpClient(OkHttp) {
    install(Logging) {
        // 你的日志配置项
    }
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
            prettyPrint = false
            // 其他自定义序列化规则
        })
    }
    install(WebSockets) {
        // 你的WebSocket配置项
    }
}

如果Retrofit也需要使用同一份Json配置,还可以把这个Json实例抽成全局单例,同时供Ktor和Retrofit复用,避免多实例不一致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:12:08