使用 Jackson 将 JSON 转换为 Java Record(实用指南 + 在线工具)
Source: Dev.to

将 JSON 解析为 Java 类型是后端开发者的日常任务。随着 Java 17 中 record 已成为语言的一部分,不可变的数据模型编写和维护变得更加简便。但事实是:大多数教程仍然教你如何将 JSON 映射到 POJO,而不是映射到 record,而且很少涉及能节省时间的工具。
在本文中,我将演示如何使用 Jackson 将 JSON 转换为 Java 17 record,解释关键的注解,并分享如何通过在线生成器实现自动化。我还会展示 Toolshref JSON‑to‑Java 代码转换器(针对 record) 如何融入实际工作流。
为什么在 JSON 数据中使用 Java Records?
Java records 是在 Java 16 引入并在 Java 17 完成的简单、不可变的数据载体。
它们提供:
- 简洁语法 – 无需冗余的构造函数、getter、
equals/hashCode、toString。 - 默认不可变 – 字段为
final。 - 更好地与 JSON API 对齐,因为数据对象只是容器。
在基于 Spring Boot、Quarkus 或 Micronaut 的 API 中,records 能减少杂乱并让重点聚焦于业务逻辑。但开发者常常会问:
“Jackson 能把 JSON 反序列化为 Java record 吗?”
是 – 但需要了解几条规则。
Jackson JSON 转 Record:开箱即用的功能
Jackson 2.12+ 原生支持 Java records。这意味着:
- Jackson 将 JSON 属性映射到 record 组件。
- 不需要 setter 方法。
- 规范构造函数直接接收这些值。
示例 JSON
{
"id": 101,
"name": "Alice",
"email": "alice@example.com"
}
等价的 Java record
public record User(int id, String name, String email) {}
使用 Jackson 进行反序列化
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonString, User.class);
如果 JSON 键与 record 组件名称匹配,Jackson 会自动完成映射。
Source: …
当你需要为 Record 使用 Jackson 注解
有些情况下默认设置不足以满足需求:
- JSON 使用 snake_case,而 Java 使用 camelCase。
- 你想要忽略未知属性。
- 需要自定义日期/时间格式。
Jackson 注解在 record 上的使用方式与在普通 POJO 上完全相同。
@JsonProperty
当 JSON 键名与 record 字段名不匹配时使用 @JsonProperty:
public record User(
@JsonProperty("user_id") int id,
@JsonProperty("full_name") String name
) {}
@JsonIgnoreProperties
如果输入的 JSON 包含你不关心的额外字段:
@JsonIgnoreProperties(ignoreUnknown = true)
public record User(int id, String name) {}
@JsonFormat
用于日期的自定义格式:
public record Event(
int id,
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime timestamp
) {}
常见的 Jackson 与 Records 的陷阱
1. 缺少无参构造函数
Records 没有无参构造函数,这会导致期望有无参构造函数的旧框架出错。只要规范构造函数包含所有组件,Jackson 就不需要无参构造函数。如果需要更细粒度的控制,可使用 @JsonCreator:
public record User(int id, String name) {
@JsonCreator
public User(@JsonProperty("id") int id,
@JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
}
2. 嵌套 JSON 对象
只要存在相应的 Java 类型,Jackson 会自动处理嵌套结构。
JSON
{
"id": 5,
"profile": {
"age": 30,
"status": "active"
}
}
Java records
public record Profile(int age, String status) {}
public record User(int id, Profile profile) {}
Jackson 在不需要额外代码的情况下解析嵌套字段。
使用 Toolshref JSON‑to‑Java Record 转换器(实操)
我经常在将 API 响应映射到 Java 模型时使用并构建此工具。它操作简便,消除了手动编写的痛苦。
工作原理
- 粘贴你的 JSON。
- 选择 Record 作为目标类型。
- 获取可直接使用的 Java 17 record 类。
之前 JSON 的示例输出
public record User(int id, String name, String email) {}
对于嵌套 JSON,它会生成:
- 为每个嵌套对象生成单独的 record 文件。
- 正确类型化的嵌套 record。
无需手动编写嵌套 record,工具会瞬间完成。
为什么这很重要
在后端 API 快速演进的团队中,保持模型同步是一件繁琐的事。使用在线 JSON‑to‑record 转换器:
- 减少人为错误。
- 强制统一命名。
- 生成可立即完善的代码。
这加快了开发速度,提升了可维护性,让你可以专注于业务逻辑,而不是冗余的映射代码。
- 集成第三方 API 或原型设计。
