JSON 转 Java POJO
即时从 JSON 生成 Java POJO 类,支持 Jackson、Gson 和 Lombok 注解,处理嵌套对象、数组和自定义根类名。免费,在浏览器中运行。
- 在浏览器中处理
- 数据不离开你的设备
- 免费 · 无需注册
用微信扫描以下二维码即可分享
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。
类型映射
null→Object- 字符串 →
String - 整数 →
int,超出 int 范围(±2,147,483,647 左右)时 →long - 浮点数 →
double - 布尔值 →
boolean - 数组 →
List<T> - 嵌套对象 → 独立
public class
示例
给定如下 JSON:
{"user": {"first_name": "Alice", "age": 30}, "tags": ["admin"]}
Lombok 模式下生成:
import java.util.List;
import lombok.Data;
@Data
public class RootObject {
private User user;
private List<String> tags;
}
@Data
public class User {
private String firstName;
private int age;
}
示例:带嵌套明细的订单(Jackson 模式)
输入:
{"order_id": 9007, "customer": {"name": "Alice", "vip": true}, "items": [{"sku": "A-1", "qty": 2, "price": 9.5}, {"sku": "B-2", "qty": 1, "price": 20}], "note": null}
输出(省略了 getter / setter):
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
public class RootObject {
@JsonProperty("order_id")
private int orderId;
private Customer customer;
private List<ItemsItem> items;
private Object note;
// getters and setters omitted here
}
public class Customer {
private String name;
private boolean vip;
// ...
}
public class ItemsItem {
private String sku;
private int qty;
private double price;
// ...
}
这段输出不能整体存成一个文件编译:每个 public class 必须放在同名文件里。拆成 RootObject.java、Customer.java、ItemsItem.java 三个文件后,「无注解」模式的输出可以直接用 javac 21 编译。
生成后要检查的地方
price是double:第一个元素是9.5、第二个是20,工具把int和double合并成更宽的double。金额建议改用BigDecimal。- 样例里的
null会变成Object,请换成真实类型。 - 样例里超出 int 范围的整数(如毫秒时间戳
1730000000000)会生成long;样例值小、实际可能变大的 ID 请自己改成long。 - Lombok 模式不会加
@JsonProperty,order_id不再映射到orderId:
import java.util.List;
import lombok.Data;
@Data
public class RootObject {
private int orderId;
private Customer customer;
private List<ItemsItem> items;
private Object note;
}
Lombok 模式下请自己补 @JsonProperty,或给 Jackson 配置 PropertyNamingStrategies.SNAKE_CASE。Gson 模式用 @SerializedName 做同样的映射。
用 Jackson 读取 JSON:
ObjectMapper mapper = new ObjectMapper();
RootObject order = mapper.readValue(json, RootObject.class);
Java 16 及以上,简单的不可变模型可以改用 record,Jackson 2.12 起支持读取 record:
public record Customer(String name, boolean vip) {}
示例:同名 key 结构不同、key 不是合法 Java 名(Jackson 模式)
{"billing": {"address": {"city": "Paris"}}, "shipping": {"address": {"line1": "1 Main St"}}, "class": "A", "2fa": true, "URL": "https://example.com"}
输出(省略了大部分 getter / setter):
import com.fasterxml.jackson.annotation.JsonProperty;
public class RootObject {
private Billing billing;
private Shipping shipping;
@JsonProperty("class")
private String classValue;
@JsonProperty("2fa")
private boolean t2fa;
@JsonProperty("URL")
private String uRL;
@JsonProperty("URL")
public String getURL() {
// 其余 getter / setter 省略
}
public class Address {
private String city;
// ...
}
public class ShippingAddress {
private String line1;
// ...
}
- 两个
address字段不同,第二个用父级名作前缀(ShippingAddress)。字段和类型都相同的对象共用一个类;加前缀后仍重名时再加数字。 - Java 关键字和字面量加
Value(class→classValue),会以数字开头的名字加T(2fa→t2fa),变成同一个名字的 key 依次加数字(first-name和first_name→firstName和firstName2)。注解保留原 key。 - Jackson 把
getURL()读作url,不是uRL。getter 和 setter 不加注解时,Jackson 会多出一个属性,读到URL时报错。Gson 只读字段,不需要这条注解。
工具的测试用 javac 21、Jackson 2.17.2 和 Gson 2.11.0 编译每段 Jackson / Gson 输出,读入样例再写回,结果与原 JSON 相同;每段 Lombok 1.18.34 输出都能编译。
限制
- 无注解与 Lombok 模式只有 Java 名。这两种模式下
classValue、t2fa对应不到class、2fa。key 不是合法 Java 名时请用 Jackson 或 Gson 模式。 - Jackson 写不出空 key。
@JsonProperty("")表示「用默认名」,所以对 key""工具写@JsonAlias("")加一行注释:Jackson 能读{"": 4},写回时是{"t": 4}。Gson 模式写@SerializedName(""),保留空 key。
FAQ
这个工具生成什么?
从 JSON 生成 Java POJO(Plain Old Java Object)类。每个嵌套对象都会成为独立的公共类,包含私有字段和 getter/setter 方法(Lombok 模式使用 @Data)。
支持哪些注解模式?
四种模式:无注解(纯 POJO,含 getter/setter)、Jackson(@JsonProperty)、Gson(@SerializedName)和 Lombok(@Data)。Jackson 和 Gson 模式在 JSON key 与字段名不一致时给字段加注解;Jackson 由 getter / setter 推出的名字与字段名不同时(getURL 被读作 url),Jackson 模式也给 getter 和 setter 加注解。无注解与 Lombok 模式不保留原 key。
JSON 类型如何映射到 Java 类型?
string→String、integer→int(超出 int 范围为 long)、float/double→double、boolean→boolean、null→Object、array→List<T>、嵌套对象→独立类。
何时会添加 List 导入?
当输出中存在数组字段时,会自动添加 import java.util.List。
我的数据会发送到服务器吗?
不会。整个转换在浏览器中运行,数据不会离开本机。