【问题标题】:JSON Deserialization of collections that contain null values包含空值的集合的 JSON 反序列化
【发布时间】:2021-08-03 09:51:49
【问题描述】:

我得到以下 JSON 字符串:

{"userIds":[null, "FA9C67A8-1C22-4393-A701-136C85BB0D6F"]}

我想将其反序列化为具有一个元素(UUID)的集合。我的目标类看起来有点像这样:

data class TestDto(
    val userIds: Set<UUID> = emptySet(),
    [...]
)

我正在使用 Kotlin 1.5.21、Spring-Boot 2.4.4。 userIds 的类型不允许集合中有空值。但是,在反序列化 JSON 字符串时,该集合包含两个值,即 null 值和 UUID。这会导致稍后出现NullPointerException,我实际上认为可以通过将类型设置为Set&lt;UUID&gt; 而不是Set&lt;UUID?&gt; 来消除它。

如果提供了反序列化时,我如何忽略/过滤掉任何空值?

【问题讨论】:

    标签: kotlin jackson


    【解决方案1】:

    我认为

    @JsonSetter(contentNulls = Nulls.SKIP)
    val userIds: Set<UUID> = emptySet(),
    [...]
    

    应该做的伎俩

    【讨论】:

    • 非常感谢。这解决了问题。我仍然想知道为什么这是必要的,因为我使用 Kotlin
    • Kotlin 会保证 Set 中没有 null 值,但是,它不能保证某些代码不会尝试在 Set 中添加 null。因此,当某些代码尝试时会出现 NPE。
    • 我试图以编程方式将 null 添加到集合中,它根本无法编译,这是预期的。 Jackson 如何将 null 添加到集合中而我的代码不能?如果集合中不允许 null ,则应该发生错误,或者至少 null 不应该在集合中,对吧?
    • Jackson 仍然是 Java 代码,而不是 kotlin,所以它会在那里编译并尝试添加 null。正确的是,如果某些 java 代码尝试添加 null,它会抛出 NPE,因为 Set 不允许它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多