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

发布: (2026年1月4日 GMT+8 20:03)
6 min read
原文: Dev.to

Source: Dev.to

Cover image for Convert JSON to Java Record with Jackson (Practical Guide + Online Tool)

Sam T

将 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/hashCodetoString
  • 默认不可变 – 字段为 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 模型时使用并构建此工具。它操作简便,消除了手动编写的痛苦。

👉 在此使用

工作原理

  1. 粘贴你的 JSON。
  2. 选择 Record 作为目标类型。
  3. 获取可直接使用的 Java 17 record 类。

之前 JSON 的示例输出

public record User(int id, String name, String email) {}

对于嵌套 JSON,它会生成:

  • 为每个嵌套对象生成单独的 record 文件。
  • 正确类型化的嵌套 record。

无需手动编写嵌套 record,工具会瞬间完成。

为什么这很重要

在后端 API 快速演进的团队中,保持模型同步是一件繁琐的事。使用在线 JSON‑to‑record 转换器:

  • 减少人为错误。
  • 强制统一命名。
  • 生成可立即完善的代码。

这加快了开发速度,提升了可维护性,让你可以专注于业务逻辑,而不是冗余的映射代码。

  • 集成第三方 API 或原型设计。
Back to Blog

相关文章

阅读更多 »

我直到构建持久层才明白 JPA

封面图片 👉“I Didn’t Understand JPA Until I Built the Persistence Layer” https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto...

Spring Data JPA 关系

介绍 新年快乐!在我 full‑stack 之旅的过去十天里,我在加入后立刻开始着手项目。起初,我在 Re...