kotlin 使用Jackson进行反序列化时忽略空字段

g0czyy6m  于 2023-08-06  发布在  Kotlin
关注(0)|答案(3)|浏览(217)

我有以下Kotlin数据类:

data class TestObject(
        val boolField: Boolean,
        val stringField: String,
        val nullBoolField: Boolean = true,
        val nullStringField: String = "default",
        val notThereBoolField: Boolean = true,
        val notThereStringField: String = "not there"
)

字符串
然后,我尝试使用Jacksonv2.9.4和JacksonKotlin插件v2.9.4.1将一些JSON反序列化到这个类中。测试JSON如下:

{
    "boolField": true,
    "stringField": "string",
    "nullBoolField": null,
    "nullStringField": null
}


前两个和最后两个字段成功反序列化-使用JSON中的值和Kotlin数据类中的默认值。但是,当存在中间的字段对时,反序列化失败,并显示:
由于创建者参数nullStringField(不可为空的类型)的值缺失(因此为NULL),JSON属性nullStringField的[simple type,class com.example.TestObject]值的示例化失败
我知道我可以通过将nullBoolFieldnullStringField的类型分别更改为Boolean?String?来解决这个问题,但是由于默认值是已知的,所以我宁愿不必通过这样做将null的处理进一步推入代码中。
问题是:当属性存在于JSON中但设置为null时,是否有任何方法可以配置Jackson使用Kotlin数据类的默认值作为不可空属性?

xfyts7mz

xfyts7mz1#

你可以先尝试从json中过滤空值,然后将其反序列化为Kotlin对象。
或者你可以尝试在kotlin-jackson模块中添加一个新的特性参数,这将启用null忽略json参数并使用默认值。你可以通过修改这一行来实现(如果我没弄错的话)

uinbv5nw

uinbv5nw2#

如果你没有任何值,并且字段是不可空的,那么你不应该在请求体中传递它:

{
    "boolField": true,
    "stringField": "string"
}

字符串
这将生成以下对象,正如预期的那样:

{
    "boolField": true,
    "stringField": "string",
    "nullBoolField": true,
    "nullStringField": "default",
    "notThereBoolField": true,
    "notThereStringField": "not there"
}

ctehm74n

ctehm74n3#

如果你正在Map到Java 8,你可以用途:

val kotlinModule = KotlinModule.Builder()
        .disable(KotlinFeature.StrictNullChecks)
        .build()
    val objectMapper = ObjectMapper()
    objectMapper.registerModules(
        Jdk8Module(),
        kotlinModule
    )

字符串

相关问题