【问题标题】:Ignoring null fields when deserializing with Jackson使用 Jackson 反序列化时忽略空字段
【发布时间】:2018-07-21 23:33:29
【问题描述】:

我有以下 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 数据类的默认值,视情况而定。但是,当中间的一对字段存在时,反序列化会失败并显示:

[简单类型,类 com.example.TestObject] 值的实例化 由于缺少 JSON 属性 nullStringField 失败(因此 NULL) 创建者参数 nullStringField 的值,它是 不可为空的类型

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

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

【问题讨论】:

  • 你找到答案了吗,我还是同样的问题,暂时解决不了...?

标签: jackson kotlin


【解决方案1】:

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

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

【讨论】:

  • you may to try add feature to kotlin-jackson module, with adding a new feature parameter, which will enable a null ignoring from json parameters and use default values。那将如何运作?有什么例子吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • 我同意这将是最简单的方法。但是,在这种情况下,我不控制源 JSON,因此我试图找到一种在反序列化时获得预期结果的方法。
  • @George 在这种情况下,您可以使用 DTO,然后根据其属性创建 TestObject
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 2012-02-01
  • 2017-12-13
  • 2020-02-16
  • 1970-01-01
  • 2016-11-21
  • 2013-04-11
  • 2012-06-29
相关资源
最近更新 更多