news 2026/6/19 19:31:54

jackson-module-kotlin 完整详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jackson-module-kotlin 完整详解

目录

一、核心定位

二、原生 Jackson 处理 Kotlin 的原生痛点(不加该依赖会出现的问题)

1. Kotlin 数据类 data class 反序列化失败

2. 属性默认值丢失

3. 只读属性 val 无法赋值

4. 可空类型 / 非空类型校验失效

5. 特殊类型无法序列化

6. 不识别 Kotlin 注解

三、jackson-module-kotlin 核心功能(逐一解决上面问题)

1. 自动适配全参构造,无需无参构造

2. 自动填充构造参数默认值

3. 支持 val 只读属性注入

4. 强 Kotlin 空安全校验

5. 全面兼容 Kotlin 特有类型

6. 优化枚举序列化

7. 兼容 Kotlin 注解与 Jackson 注解联动

8. 支持内联类 value class(新版模块)

四、如何启用模块(必须注册才生效,只加依赖没用)

SpringBoot 项目(自动注册,无需手动配置)

原生 Kotlin/Java 项目手动注册

五、实战对比:有无依赖的差异示例

定义 Kotlin 数据类

六、版本匹配注意事项

七、总结一句话作用


一、核心定位

jackson-module-kotlin是 Jackson 官方提供的Kotlin 专用扩展模块,专门解决 Jackson 原生(Java 版)序列化 / 反序列化 Kotlin 代码时的各类兼容缺陷,让 Jackson 完美支持 Kotlin 独有语法:数据类、无参构造、默认参数、空安全、顶层函数、val/varnullable类型等。

Jackson 原生只适配 Java 语法,直接序列化 Kotlin 类会大量报错,这个模块就是兼容桥。

二、原生 Jackson 处理 Kotlin 的原生痛点(不加该依赖会出现的问题)

1. Kotlin 数据类data class反序列化失败

Kotlin 数据类只有全参构造函数,没有无参构造; 原生 Jackson 默认需要无参构造实例化对象,直接抛异常:No suitable constructor found for type ... can not instantiate from JSON object

2. 属性默认值丢失

Kotlin 支持构造参数默认值:

data class User(val name: String, val age: Int = 18)

原生 Jackson 反序列化时,如果 JSON 不传age,不会自动填充默认值,直接赋值null,触发空安全崩溃。

3. 只读属性val无法赋值

Kotlinval是只读字段,无 setter;Java 反射无法修改,原生 Jackson 无法给val属性注入 JSON 值。

4. 可空类型 / 非空类型校验失效

val phone: String?/val id: Long原生 Jackson 不会校验空安全,JSON 传null给非空字段不会报错,运行时空指针。

5. 特殊类型无法序列化

  • Kotlin 集合:List<T>MutableListSequence
  • 单例object、枚举enum class、密封类sealed class
  • Pair/TripleUnit、顶层变量
  • 延迟初始化lateinit、委托属性by lazy

6. 不识别 Kotlin 注解

@JvmField@JsonIgnore在 Kotlin 中行为异常,原生 Jackson 解析逻辑错乱。

三、jackson-module-kotlin 核心功能(逐一解决上面问题)

1. 自动适配全参构造,无需无参构造

模块内部集成 Kotlin 反射,读取类的主构造函数,通过带参构造直接实例化对象,不再强制要求空构造,data class开箱即用。

2. 自动填充构造参数默认值

反序列化时:

  1. 读取 Kotlin 元数据,获取每个参数默认值;
  2. JSON 缺失字段时,自动使用代码里定义的默认值;
  3. 避免手动给字段赋默认、空指针。

3. 支持val只读属性注入

通过 Kotlin 反射绕过 Java setter 限制,直接通过构造函数赋值,val属性完全正常序列化、反序列化。

4. 强 Kotlin 空安全校验

反序列化时校验类型可空性:

  • 非空字段(String)JSON 传null→ 直接抛出序列化异常,提前拦截 NPE;
  • 可空字段(String?)允许null,符合 Kotlin 语法规范。

5. 全面兼容 Kotlin 特有类型

  • 数据类 data class
  • 单例 object、密封类 sealed class、枚举
  • Pair/Triple、Range、Sequence
  • 顶层类、顶层函数返回值
  • Mutable 可变集合、不可变集合

6. 优化枚举序列化

Kotlin 枚举支持属性、自定义构造,模块适配枚举的序列化 / 枚举名称匹配。

7. 兼容 Kotlin 注解与 Jackson 注解联动

@JsonProperty@JsonIgnore@JsonFormat在 Kotlin 类中行为和 Java 完全一致,识别@JvmField修饰字段。

8. 支持内联类value class(新版模块)

高版本 jackson-module-kotlin 支持 Kotlin 1.5+ 内联值类序列化。

四、如何启用模块(必须注册才生效,只加依赖没用)

SpringBoot 项目(自动注册,无需手动配置)

SpringBoot 自动检测 classpath 存在jackson-module-kotlin,会自动把模块注册到全局ObjectMapper,直接使用。

原生 Kotlin/Java 项目手动注册

import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule val mapper = ObjectMapper() .registerKotlinModule() // 核心注册代码

五、实战对比:有无依赖的差异示例

定义 Kotlin 数据类

data class User( val username: String, val age: Int = 18, val email: String? )

JSON 输入(缺少 age):

{"username":"zhangsan","email":null}
  1. 不加 jackson-module-kotlin

    • 反序列化直接报错:找不到构造函数;
    • 就算加无参构造,age 不会填充 18,变成 null,访问 age 触发空指针。
  2. 添加并注册模块后

    • 通过全参构造创建 User;
    • age 自动赋值默认值 18;
    • email 允许 null(声明为可空);
    • 如果 email 定义为String(非空),JSON 传 null 直接抛序列化异常。

六、版本匹配注意事项

该模块版本必须和核心 jackson-databind 版本保持一致,否则反射兼容报错:

<!-- jackson 核心包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> <!-- kotlin 模块版本和上面完全一致 --> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>2.15.2</version> </dependency>

七、总结一句话作用

jackson-module-kotlin是 Jackson 的 Kotlin 反射兼容模块,补齐原生 Jackson 对 Kotlin 数据类、默认参数、val 只读属性、空安全、特殊类型的序列化 / 反序列化支持,解决无构造报错、默认值丢失、空指针等一系列 Kotlin 序列化问题,是 SpringBoot Kotlin 项目必引依赖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 19:16:40

DeepSeek-V4定价真相:显存、框架与提示词如何决定真实成本

1. 项目概述&#xff1a;这不是在问“贵不贵”&#xff0c;而是在拆解一场定价逻辑的实战推演“如何评价DeepSeek-V4的价格&#xff1f;”——看到这个标题&#xff0c;我第一反应不是去查官网报价单&#xff0c;而是下意识摸了摸自己去年部署V2时那台差点过热关机的A10服务器。…

作者头像 李华
网站建设 2026/6/19 19:14:40

Mac鼠标滚轮优化神器:3步让外接鼠标获得触控板般的顺滑体验

Mac鼠标滚轮优化神器&#xff1a;3步让外接鼠标获得触控板般的顺滑体验 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independen…

作者头像 李华
网站建设 2026/6/19 18:51:23

AD铜皮内缩操作

设置铜皮内缩1. Keepout层绘制线&#xff0c;通过线对铜皮进行操作 &#xff08;快捷&#xff0c;野路子&#xff09;2.通过设计规则进行修改&#xff08;标准&#xff0c;正规军&#xff09;设置内缩的层&#xff0c;内缩的尺寸

作者头像 李华
网站建设 2026/6/19 18:47:57

一图掌握el-table样式深度定制:从基础美化到高级交互

1. 从零开始认识el-table的样式痛点 第一次接触Element UI的el-table组件时&#xff0c;相信很多开发者都经历过这样的心路历程&#xff1a;看到默认样式时觉得"够用了"&#xff0c;实际应用到项目却发现处处不顺手。比如表头背景色与品牌色不协调、行高拥挤得像早高…

作者头像 李华
网站建设 2026/6/19 18:44:40

探索17种城市地图主题:用代码创作个性化极简主义海报

探索17种城市地图主题&#xff1a;用代码创作个性化极简主义海报 【免费下载链接】maptoposter Transform your favorite cities into beautiful, minimalist designs. MapToPoster lets you create and export visually striking map posters with code. 项目地址: https://…

作者头像 李华