Ktor中如何实现含可选泛型字段的API响应模型?
解决泛型API响应模型兼容可选data字段的问题
问题原因
报错核心是泛型类型擦除:运行时JVM会擦除T的具体类型信息,当JSON响应不含data字段时,Kotlinx Serialization无法自动推断T?对应的序列化器,导致解析失败。
解决方案
方案1:使用reified泛型的解析函数
将解析逻辑封装为inline+reified的扩展函数,保留T的实际类型信息:
inline fun <reified T> Json.decodeResponse(json: String): Response<T> { return this.decodeFromString(json) }
调用示例:
// 解析带data的响应 val userResponse = json.decodeResponse<User>("""{"code":"200","message":"ok","data":{"id":1}}""") // 解析不带data的响应 val emptyResponse = json.decodeResponse<User>("""{"code":"200","message":"no data"}""")
方案2:显式指定序列化器
如果无法使用reified(比如非inline函数场景),解析时手动传入T的序列化器:
// 假设要解析的data类型是User val serializer = Response.serializer(User.serializer()) val response = json.decodeFromString(serializer, jsonString)
方案3:增强模型字段兼容性(可选)
在data字段上添加@Optional注解,强化字段缺失时的默认值识别(需配合前两种方案使用,单独无法解决类型擦除问题):
@Serializable public data class Response<out T>( val code: String, val message: String, @Optional val data: T? = null, )
补充说明
你现有Json配置ignoreUnknownKeys = true和encodeDefaults = true无需修改,已能适配字段缺失场景,核心问题还是泛型类型的序列化器获取。
内容的提问来源于stack exchange,提问作者Kleckus
相关产品推荐
相关产品推荐

