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

时间:2018-02-11 19:36:12

标签: jackson kotlin

我有以下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"
)

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

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

前两个和后两个字段成功反序列化 - 使用JSON中的值和Kotlin数据类中的默认值(如果适用)。但是,当存在中间的一对字段时,反序列化将失败,并显示:

  

[simple type,class com.example.TestObject]值的实例化   由于缺少JSON属性nullStringField失败(因此   NULL)创建者参数nullStringField的值,它是一个   非可空类型

我知道我可以通过分别将nullBoolFieldnullStringField的类型更改为Boolean?String?来解决问题,但是因为默认价值是已知的我宁愿不必通过这样做将null的处理进一步推进到代码中。

问题是:当JSON中存在属性但设置为null时,是否有任何方法可以配置Jackson将Kotlin数据类默认值用于非可空属性?

2 个答案:

答案 0 :(得分:1)

您可以先尝试从json过滤空值,然后再将其反序列化为Kotlin对象。

或者您可以尝试向kotlin-jackson模块添加功能,添加一个新的功能参数,该参数将启用从json参数中忽略空值并使用默认值。 您可以通过修改此line(如果我没有记错)

来执行此操作

答案 1 :(得分:0)

如果您没有任何值且字段不可为空,那么您不应该在请求正文中传递它:

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

这会产生以下对象,如预期的那样:

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