JSON 转 Java Class
生成 Java Record 或 POJO Class、嵌套模型与可选 Jackson 注解
根据样本推断,不是完整 API 契约。字段缺失与显式 null 分别推断,输出类型可能合并两者;数组内的 null 单独保留可空性。重复键和会改变数值的输入会报错。
上限:1 MiB、64 层、20,000 个值、200 个模型、2,000 个模型字段。精确大整数或金额请用字符串。
目标:Java 17+ 与 Jackson 2.x。生成包内可见类型;跨包使用时请拆成同名文件并添加 public。公开字段 POJO 不生成 getter;Jackson 模式拒绝空键。键名最多 16,000 个 UTF-16 码元,Record 最多 254 个字段。
生成后请在目标项目编译,并用代表性响应验证反序列化。
工具说明
JSON 转 Java Class 从一个对象或多个对象样本推断 Java 17+ Record 或含公开字段的 POJO。Jackson 2.x 注解在标识符规范化后保留原 JSON 键;关闭注解时需要项目命名策略或自定义映射。Jackson 模式拒绝空 JSON 键,因为 JsonProperty("") 表示默认名称,不能指向空键。字段使用装箱 Long、Double、Boolean,字符串使用 String,数组使用 List,不兼容混合值使用 Object。推断会分别观察缺失与 null,但生成 Java 模型中二者都可能变成 null,模型不保存字段出现历史。空 POJO 带序列化标记,可由 Jackson 写出空对象。生成类型为包内可见,允许同一个文件包含全部声明;作为公开 API 时,请拆成同名文件并按需添加 public。本地解析限制为 1 MiB、64 层、20,000 个值、200 个模型与 2,000 个字段,并检查重复键与数值损失。精确大 ID 或小数请用字符串。工具不自动选择 BigDecimal、时间类、枚举或校验约束,使用前应编译并验证代表性响应的反序列化。 JVM 还要求:JSON 键最多 16,000 个 UTF-16 码元,Record 最多 254 个字段,生成标识符会先缩短至 80 字符再分配唯一后缀。POJO 模式可避开过大的 Record 构造函数。
场景配方
编译包含冲突 JSON 键的 Record
目标:两个原始键保持映射,不生成非法 Record 访问器。
- 粘贴 {"getClass":1,"class":2},选择 Java Record 并开启 Jackson。
- 生成并检查重命名后的 getClassValue 与 classValue。
- 使用 Java 17+ 和 Jackson 编译,读入原样本并核对两个值。
结果:两个原始键保持映射,不生成非法 Record 访问器。
失败门诊(高频踩坑)
文件编译通过但其他包无法访问
原因:包内可见类型只在所在包暴露模型。
修复:将需要公开的类型拆到各自同名文件,再添加 public。
金额被推断为 Double
原因:JSON 数字样本无法说明货币契约。
修复:推断时将精确金额用字符串表示,在应用中换为经过验证的 BigDecimal 转换。
生产可用片段
避开 Record 与 Object 方法名冲突
java
// Input: {"getClass":1,"class":2}
record ApiResponse(
@JsonProperty("getClass") Long getClassValue,
@JsonProperty("class") Long classValue
) {}
// Requires import com.fasterxml.jackson.annotation.JsonProperty;常见问题
输出面向哪些 Java 与 Jackson 版本?
此工作流面向 Java 17+ Record,Jackson 注解面向 2.x。工具只生成源码,依赖由目标项目配置。
为什么生成类型是包内可见?
这样一个文件可以容纳多个顶层模型。其他包需要访问时,将类拆为同名文件并添加 public。
JsonProperty 能映射空键吗?
空注解名选择默认名称,因此生成器在 Jackson 模式拒绝空 JSON 键,需要自行映射。
可选装箱值会保留缺失状态吗?
不会。缺失与显式 null 都可能反序列化为 null。若更新逻辑依赖此区别,需要额外记录字段是否出现。
继续浏览