ktor - Kotlinx 序列化 MissingFieldException
问题描述
我正在使用 Ktor 将 Moshi 序列化转换为 kotlinx 序列化,当我尝试请求获取数据时出现此错误
kotlinx.serialization.MissingFieldException:字段“附件”是必需的,但缺少
这是有道理的,因为这个特定的响应不包含这个字段
响应 JSON
{
"data": {
"id": "1299418846990921728",
"text": "This is a test"
}
}
但是我的序列化类的attachments
字段可以为空(它仅在需要时才在响应中)所以它应该忽略它我认为就像它对 Moshi 所做的那样
@Serializable
data class ResponseData(
val id: Long
val attachments: Attachments?,
val author_id: String?,
val text: String
}
在我的 Ktor 客户端设置中,我将其设置为忽略未知键
private val _client: HttpClient = HttpClient(engine) {
install(JsonFeature) {
val json = Json {
this.isLenient = true
this.ignoreUnknownKeys = true
}
serializer = KotlinxSerializer(json)
}
}
为什么即使它可以为空,它仍然说该字段是必需的?
解决方案
我想通了,显然即使您将某些内容标记为可为空的,它仍然认为是必需的。
为了让它真正是可选的,你需要给它一个默认值,例如数据类看起来像这样,带有可空值
@Serializable
data class ResponseData(
val id: Long
val attachments: Attachments? = null,
val author_id: String? = null,
val text: String
}
一旦你设置了值,这些字段就变成了可选的并且不会抛出那个异常
推荐阅读
- core-data - ManagedObject 和 ObservedObject
- selenium - 在 Chrome/Ubuntu 上未正确输入文本
- r - R - 如何从特定点开始更改矩阵中的元素
- react-native - 尝试在 Jest 测试中渲染 react-native-reanimated 节点时出现“TypeError”
- traefik - Traefik 的简单反向代理示例
- powershell - Windows 10 Powershell 将插入模式更改为在一定数量的字符后覆盖
- graphics - IAR 和 CubeIDE 的 STM32F746G 和 touchGFX 问题
- scala - twitter4s:如何阻止 twitter 流将日志打印到控制台
- java - 在 ANTLR4 中解析字符串片段
- python - Pandas:如何将每个数据框行导出到一个新的数据框中?