我正在使用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)
}
}为什么它仍然说字段是必需的,即使它是可空的?
发布于 2021-10-15 12:02:58
在v1.3.0中,您可以配置Json特性,使用explicitNulls = false将缺席字段视为null
install(JsonFeature) {
serializer = KotlinxSerializer(
json = kotlinx.serialization.json.Json {
explicitNulls = false
}
)
}explicitNulls文档
指定是否应为可空属性编码空值,并在解码过程中必须在JSON对象中显示空值。当禁用此标志时,没有默认的空值的属性不会被编码;在解码期间,对于没有默认值的可空属性,字段值的缺失被视为空值。默认情况下为true .
发布于 2022-09-27 11:30:12
SpringRestController也有同样的例外,在缺少数据的情况下,我需要发送BAD_REQUEST响应。我可以通过下面的代码来实现这一点。
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = [SerializationException::class])
open fun handleRequestError(ex: SerializationException) = //
log.warn("Unable to process incomplete request", ex)https://stackoverflow.com/questions/64796913
复制相似问题