JSON 转 Java 实体类
把 JSON 生成带 @Data 的 Java 实体类,嵌套对象各成独立类,下划线字段转驼峰并补注解。
用 Jackson 反序列化 JSON 之前总要先写一遍实体类:字段名转驼峰、补 getter 和 setter、给下划线字段加 @JsonProperty,几十个字段能写掉十几分钟,漏一个注解就会出现字段为 null。把 JSON 粘进来可以直接得到带 @Data 的实体类,嵌套对象各成独立的类,注解按需要生成。
整个过程在浏览器本地完成,代码不会上传,公司内部接口的字段名也不会外泄。生成的类只做结构映射,不含业务注解和校验规则,所以它是起点而不是终点:数值类型、时间格式、必填约束这些需要结合业务判断的部分,仍要在拿到代码后按项目规范调整。
生成的类结构
每个对象(含嵌套)生成独立的类,类名由键名转大驼峰,顶层类固定叫 RootModel。类上只加 @Data,没有 @Builder、@NoArgsConstructor 等注解,也没有 package 声明。文件头部固定输出 lombok.Data、JsonProperty 和 java.util.List 三行 import,用不到可删。Jackson 反序列化依赖无参构造,这里靠 @Data 生成的默认构造满足,前提是类里没有 final 字段;不用 Lombok 就必须自己补 getter、setter 和无参构造。
字段类型与数值陷阱
整数映射成包装类型 Integer,小数映射成 Double,布尔和字符串分别映射成 Boolean、String,null 映射成 Object,空数组映射成 List<Object>。生成器不区分 Long 和 BigDecimal:订单号、雪花 ID 这类超过 21 亿的整数会生成 Integer,反序列化时可能溢出;金额用 Double 存在精度问题。这类字段建议手工改成 Long 或 BigDecimal,数组元素和时间字段同理,生成结果需要过一遍业务判断。
命名冲突与注解
字段名会把下划线和连字符转成大驼峰,只有转换后与原始键不一致时才补 @JsonProperty 注解,键本来就是驼峰形式就不加。这里有个必须注意的冲突:如果同一个对象里同时存在 user_name 和 user-name,两者都会归一成 userName,生成重复字段而编译不过,需要手工改名。含点号或空格的键同样会产生非法标识符,中文键名在 Java 语法上允许但不建议在实体类中使用。
常见问题
- 生成的实体类需要引入哪些依赖?
- 需要 Lombok 提供 @Data,自动生成 getter、setter、toString 和默认构造;还需要 Jackson 的 annotations 包提供 @JsonProperty。两个 import 结果里都带了,但依赖要自己在 pom.xml 或 build.gradle 里加。若团队禁用 Lombok,则要手工补齐这些方法并显式写出无参构造。
- 时间字段为什么生成 String 而不是 Date 或 LocalDateTime?
- JSON 里时间就是字符串,生成器只看数据类型,不按字段名或命名格式做识别,所以一律生成 String,由 Jackson 原样绑定为文本。要改成 LocalDateTime 或 Date,需要手工替换类型,并确认 Jackson 的时间格式配置。
- 为什么生成结果会因为字段重名而编译不过?
- 命名转换会把 user_name 和 user-name 都归一成 userName,两个键同时存在时就会生成两个同名字段,Java 编译直接报重复变量。下划线与驼峰混用的对象也可能撞名。解决方式是在 JSON 侧统一键名,或者手工删掉其中一个字段。
- 数组和嵌套对象分别怎么处理?
- 嵌套对象会拆成独立类,字段类型指向该类;数组生成 List 泛型,元素类型仍只看第一个元素。空数组因为没有元素可推断,只能生成 List<Object>,需要在拿到真实数据后手工补上泛型,否则取元素时要做强制类型转换。