首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlinx序列化MissingFieldException

Kotlinx序列化MissingFieldException
EN

Stack Overflow用户
提问于 2020-11-12 02:09:10
回答 2查看 11.9K关注 0票数 31

我正在使用Ktor从Moshi转换为kotlinx序列化,当我试图请求获取数据时,我得到了这个错误。

kotlinx.serialization.MissingFieldException:字段“附件”是必需的,但它丢失了

这是有意义的,因为这个特定的响应不包含这个字段。

回应Json

代码语言:javascript
复制
{
    "data": {
        "id": "1299418846990921728",
        "text": "This is a test"
    }
}

但是我的序列化类将attachments字段作为可空字段(只有在需要时它才在响应中),所以它应该忽略它,就像它对Moshi那样。

代码语言:javascript
复制
@Serializable
data class ResponseData(
    val id: Long
    val attachments: Attachments?,
    val author_id: String?,
    val text: String
}

在我的Ktor客户端设置中,我将它设置为忽略未知的键

代码语言:javascript
复制
private val _client: HttpClient = HttpClient(engine) {
    install(JsonFeature) {
        val json = Json {
            this.isLenient = true
            this.ignoreUnknownKeys = true
        }
        serializer = KotlinxSerializer(json)
    }
}

为什么它仍然说字段是必需的,即使它是可空的?

EN

回答 2

Stack Overflow用户

发布于 2021-10-15 12:02:58

在v1.3.0中,您可以配置Json特性,使用explicitNulls = false将缺席字段视为null

代码语言:javascript
复制
install(JsonFeature) {
    serializer = KotlinxSerializer(
        json = kotlinx.serialization.json.Json {
            explicitNulls = false
        }
    )
}

explicitNulls文档

指定是否应为可空属性编码空值,并在解码过程中必须在JSON对象中显示空值。当禁用此标志时,没有默认的空值的属性不会被编码;在解码期间,对于没有默认值的可空属性,字段值的缺失被视为空值。默认情况下为true .

票数 19
EN

Stack Overflow用户

发布于 2022-09-27 11:30:12

SpringRestController也有同样的例外,在缺少数据的情况下,我需要发送BAD_REQUEST响应。我可以通过下面的代码来实现这一点。

代码语言:javascript
复制
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = [SerializationException::class])
open fun handleRequestError(ex: SerializationException) = //
        log.warn("Unable to process incomplete request", ex)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64796913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档