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

6

I have the following Kotlin data class:

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"
)

我现在正在尝试使用Jackson v2.9.4及其Kotlin插件v2.9.4.1将一些JSON反序列化为该类。测试JSON如下:

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

前两个和后两个字段已经成功反序列化 - 分别使用来自JSON和Kotlin数据类的默认值,具体取决于情况。然而,当中间一对字段存在时,反序列化失败并出现以下错误: “由于缺少(因此为NULL)创建器参数nullStringField的值,而nullStringField是非空类型,因此无法将[simple type,class com.example.TestObject]值实例化为JSON属性nullStringField”。 我知道我可以通过将nullBoolField和nullStringField的类型更改为Boolean?和String?来解决问题,但是由于已知默认值,我宁愿不必通过这样做将null的处理推迟到代码中。 问题是:是否有任何方法可以配置Jackson在JSON中存在但设置为null的非可空属性时使用Kotlin数据类的默认值?

你有没有找到任何答案?我还是遇到同样的问题,目前无法解决... - Rémi P
3个回答

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

你可以尝试为Kotlin-Jackson模块添加功能,通过添加一个新的功能参数,它将启用从JSON参数中忽略null并使用默认值。这会如何运作?有任何示例吗? - denvercoder9

0

如果您没有任何值且字段为非空,则不应将其传递到请求正文中:

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

这会得到下面的对象,正如预期的那样:
{
    "boolField": true,
    "stringField": "string",
    "nullBoolField": true,
    "nullStringField": "default",
    "notThereBoolField": true,
    "notThereStringField": "not there"
}

那确实是一种简单的解决方法,我同意。然而,在这种情况下,我无法控制源JSON,因此正在尝试找到一种在反序列化时获得预期结果的方法。 - George
@George 在这种情况下,你可以使用 DTO,然后根据其属性创建 TestObject。 - pwolaq

0
如果你要映射到Java 8,你可以使用以下方法:
    val kotlinModule = KotlinModule.Builder()
        .disable(KotlinFeature.StrictNullChecks)
        .build()
    val objectMapper = ObjectMapper()
    objectMapper.registerModules(
        Jdk8Module(),
        kotlinModule
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接