You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jackson Scala反序列化时区分JSON空值与缺失字段的方案

解决Jackson 2.15.3反序列化Scala Case Class时的null与默认值问题

问题背景

使用Jackson 2.15.3将JSON反序列化为Scala case class时,遇到可选属性处理不符合预期的问题:

  • 当JSON中显式指定属性为null时,case class会使用默认值Some("default"),而非期望的None
  • 期望实现的行为:
    • JSON包含属性且值为V → 将case class属性初始化为Some(V)
    • JSON包含属性且值为null → 将case class属性初始化为None
    • JSON不包含属性 → 使用case class定义的默认值初始化

问题原因

Jackson Scala模块默认会将JSON中的null字段视为「未提供」,优先使用case class定义的默认值,而非将null映射为Option类型的None。

解决方案

修改Jackson Mapper的配置,在构建DefaultScalaModule时启用READ_NULLS_AS_NONE特性,让显式的null被映射为None,同时保留缺失字段使用默认值的行为。

修改后的Mapper配置代码

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.OptionFeature

def createMapper(): JsonMapper =
  JsonMapper
    .builder()
    .addModule(
      DefaultScalaModule.builder()
        // 启用特性:将JSON中的null映射为Option的None
        .optionFeature(OptionFeature.READ_NULLS_AS_NONE, true)
        .build()
    )
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    .build()

配置说明

  • OptionFeature.READ_NULLS_AS_NONE:该特性会告诉Jackson,当JSON中存在某个字段且值为null时,直接将对应的Option属性设置为None,不再使用case class的默认值。
  • 缺失字段处理:Jackson默认启用USE_DEFAULT_VALUES_IF_PROPERTIES_MISSING特性,因此当JSON中不包含该字段时,依然会使用case class定义的默认值Some("default")。

验证结果

修改配置后,三个测试用例均能正常通过:

  1. {"val1": "fubar"} → myClass.val1 = Some("fubar")
  2. {"val1": null} → myClass.val1 = None
  3. {} → myClass.val1 = Some("default")

内容的提问来源于stack exchange,提问作者ChristianK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:44:55