tyc*_*czj 12 ktor kotlinx.serialization
我正在使用 Ktor 从 Moshi 转换为 kotlinx 序列化,当我尝试请求获取数据时,我收到此错误
kotlinx.serialization.MissingFieldException: 字段 'attachments' 是必需的,但它丢失了
这是有道理的,因为此特定响应不包含此字段
响应JSON
{
"data": {
"id": "1299418846990921728",
"text": "This is a test"
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的 Serialized 类将该attachments字段设为可空(它仅在需要时才在响应中)所以它应该忽略它我想就像它对 Moshi 所做的那样
@Serializable
data class ResponseData(
val id: Long
val attachments: Attachments?,
val author_id: String?,
val text: String
}
Run Code Online (Sandbox Code Playgroud)
在我的 Ktor 客户端设置中,我将其设置为忽略未知密钥
private val _client: HttpClient = HttpClient(engine) {
install(JsonFeature) {
val json = Json {
this.isLenient = true
this.ignoreUnknownKeys = true
}
serializer = KotlinxSerializer(json)
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它仍然说该字段是必需的,即使它可以为空?
Tim*_*eed 40
从 v1.3.0 开始,您可以配置 Json 功能将缺失的字段视为 null,使用explicitNulls = false
install(JsonFeature) {
serializer = KotlinxSerializer(
json = kotlinx.serialization.json.Json {
explicitNulls = false
}
)
}
Run Code Online (Sandbox Code Playgroud)
文档explicitNulls:
指定是否应对可为 null 的属性编码 null 值,并且在解码期间必须存在于 JSON 对象中。当此标志被禁用时,具有空值且没有默认值的属性不会被编码;在解码期间,对于没有默认值的可空属性,缺少字段值将被视为 null。默认为 true。
tyc*_*czj 25
我想通了,显然即使您将某些内容标记为可空,它仍然被认为是必需的。
为了让它真正是可选的,你需要给它一个默认值,例如数据类看起来像这样,带有可空值
@Serializable
data class ResponseData(
val id: Long
val attachments: Attachments? = null,
val author_id: String? = null,
val text: String
}
Run Code Online (Sandbox Code Playgroud)
一旦你设置了值,字段就变成可选的并且不会抛出那个异常
| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |