JSON 转 Java 类

粘贴一段 JSON 示例,生成器便会输出一个或多个 Java 类,包含正确的字段类型、getter、setter 以及 JSON 库注解。支持 Jackson(@JsonProperty)、Gson(@SerializedName)和 Lombok(@Data/@Builder),让代码更简洁。嵌套对象会根据你所选的布局,成为内部类或同级类。

如何将 JSON 转换为 Java

  1. 1

    粘贴 JSON

    单个示例即可;提供多个示例有助于更准确地判断字段是否可为空。

  2. 2

    选择库

    Jackson(在 Spring 中最常用)、Gson(用于 Android 和部分旧项目),或不带注解的纯 POJO。

  3. 3

    选择附加选项

    Lombok 可自动生成 getter/setter、构建器模式以及 equals/hashCode;也可以保持纯净不加任何注解。

  4. 4

    选择嵌套风格

    同一文件中的同级类(Java 17+ 的 public 类必须放在各自独立的文件中),或嵌套的静态类。

  5. 5

    复制代码

    直接放入你的项目。类名与 JSON 键名一致;包名按你的配置设置。

示例输出:Jackson + Lombok

输入:

{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }

输出:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @JsonProperty("firstName")
    private String firstName;

    @JsonProperty("age")
    private int age;

    @JsonProperty("address")
    private Address address;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    @JsonProperty("city")
    private String city;
}

类型映射

JSON Java 类型
字符串 String
整数(≤ Integer.MAX) Integer / int
大整数 Long / BigInteger
小数 Double / BigDecimal
布尔值 Boolean / boolean
ISO 日期 LocalDate(Jackson JSR-310)
ISO 日期时间 Instant / OffsetDateTime
null(存在非空的同级字段) 包装类型(例如 Integer
数组 List<T>
对象 嵌套类

装箱类型与基本类型的选择

  • 基本类型(intlongboolean,不可为空,高效,无自动装箱开销。
  • 装箱类型(IntegerLongBoolean,可为空,当字段在 JSON 中可能缺失或为 null 时必须使用。

对于任何被判定为可为空的字段,生成器默认使用装箱类型,其余则使用基本类型。

Jackson 与 Gson 对比

特性 Jackson Gson
在 Spring 中的普及度 是,默认选择 否(需要额外配置)
性能 更快 更慢
JSR-310 日期支持 通过额外模块 通过额外模块
多态支持 @JsonTypeInfo RuntimeTypeAdapter
尾随逗号容忍度 否(默认)

常见错误

  • 对可为空的字段使用基本类型。 int 不能为 null;如果 JSON 中出现 "age": null,Jackson 会抛出异常。请改用 Integer
  • 缺少日期模块。 Jackson 需要 jackson-datatype-jsr310 才能支持 Instant/LocalDate。缺少它时,日期会退化为 String 或纪元长整数。
  • 在不相关的类之间共用包装类型。 如果两个 JSON 结构都包含嵌套的 Address,生成器会创建两个 Address 类。请手动重命名或合并。
  • 忘记添加 @JsonIgnoreProperties(ignoreUnknown = true) 严格模式下的 Jackson 遇到未知属性会抛出异常;添加此注解(或进行全局配置)可实现更宽容的反序列化。

常见问题

大多数情况下选 Jackson,它是 Spring 的默认选择,速度更快,多态支持也更丰富。Gson 更轻量,在 Android 中更为人熟知,不过如今 Android 项目越来越多地转向 Moshi 或 kotlinx.serialization。

Lombok 能省去大量样板代码(getter、setter、equals、hashCode、builder)。它应用广泛,但需要在构建中引入 Lombok 注解处理器。如果你的项目出于依赖整洁的考虑而避免使用 Lombok,可将其禁用。

在任一观测样本中为 null 的字段会转为装箱类型(用 Integer 而非 int),以便能够容纳 null。这样 Jackson 就能无错地反序列化 "age": null。添加 @JsonInclude(Include.NON_NULL) 可在序列化时跳过 null 值。

会的,只要选择 “record”。record 简洁、不可变,并且兼容 Jackson 2.12+。对于 Spring Boot 3 项目,使用 record 加上不依赖 Lombok 的生成方式是当下的现代之选。

相关工具

此工具还提供其他语言版本