JSON sang lớp Java
Dán một mẫu JSON và trình tạo sẽ xuất ra một hoặc nhiều lớp Java với kiểu trường phù hợp, getter, setter và chú thích thư viện JSON. Hỗ trợ Jackson (@JsonProperty), Gson (@SerializedName) và Lombok (@Data/@Builder) để mã sạch hơn. Các đối tượng lồng nhau trở thành lớp bên trong hoặc lớp ngang hàng, tùy vào bố cục bạn chọn.
Cách chuyển đổi JSON sang Java
-
1
Dán JSON
Một mẫu là đủ; nhiều mẫu giúp xác định chính xác hơn liệu một trường có thể nhận giá trị null hay không.
-
2
Chọn thư viện
Jackson (phổ biến nhất trong Spring), Gson (cho Android và một số dự án cũ), hoặc POJO thuần không có chú thích.
-
3
Chọn tùy chọn bổ sung
Lombok để tự động tạo getter/setter, mẫu builder và equals/hashCode. Hoặc để nguyên bản đơn giản.
-
4
Chọn kiểu lồng nhau
Các lớp ngang hàng trong cùng một tệp (lớp public trong Java 17 trở lên phải nằm ở các tệp riêng) hoặc các lớp static lồng nhau.
-
5
Sao chép mã
Dán vào dự án của bạn. Tên lớp khớp với khóa JSON; gói được đặt theo cấu hình của bạn.
Ví dụ đầu ra: Jackson + Lombok
Đầu vào:
{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }
Đầu ra:
@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;
}
Ánh xạ kiểu dữ liệu
| JSON | Kiểu Java |
|---|---|
| chuỗi | String |
| số nguyên (≤ Integer.MAX) | Integer / int |
| số nguyên lớn | Long / BigInteger |
| số thập phân | Double / BigDecimal |
| boolean | Boolean / boolean |
| ngày ISO | LocalDate (Jackson JSR-310) |
| ngày và giờ ISO | Instant / OffsetDateTime |
| null (khi có trường ngang hàng khác null) | Kiểu bao bọc (ví dụ Integer) |
| mảng | List<T> |
| đối tượng | lớp lồng nhau |
Chọn giữa kiểu bao bọc và kiểu nguyên thủy
- Nguyên thủy (
int,long,boolean), không thể là null, hiệu quả, không có auto-boxing. - Bao bọc (
Integer,Long,Boolean), có thể là null; cần dùng khi trường có thể vắng mặt hoặc là null trong JSON.
Theo mặc định, trình tạo dùng kiểu bao bọc cho mọi thứ được xem là có thể null, và kiểu nguyên thủy cho phần còn lại.
Jackson so với Gson
| Tính năng | Jackson | Gson |
|---|---|---|
| Mức phổ biến trong Spring | Có, mặc định | Không (cần cấu hình) |
| Hiệu năng | Nhanh hơn | Chậm hơn |
| Hỗ trợ ngày JSR-310 | Qua mô-đun bổ sung | Qua mô-đun bổ sung |
| Đa hình | @JsonTypeInfo |
RuntimeTypeAdapter |
| Chấp nhận dấu phẩy cuối | Không (mặc định) | Có |
Lỗi thường gặp
- Dùng kiểu nguyên thủy cho trường có thể là null.
intkhông thể là null; Jackson sẽ ném lỗi nếu JSON có"age": null. Hãy dùngInteger. - Thiếu mô-đun ngày. Jackson cần
jackson-datatype-jsr310choInstant/LocalDate. Không có nó, ngày sẽ lùi vềStringhoặc giá trị long theo epoch. - Dùng chung kiểu bao bọc giữa các lớp không liên quan. Nếu hai cấu trúc JSON đều có
Addresslồng nhau, trình tạo sẽ tạo hai lớpAddress. Hãy đổi tên hoặc hợp nhất thủ công. - Quên
@JsonIgnoreProperties(ignoreUnknown = true). Jackson ở chế độ nghiêm ngặt sẽ ném lỗi với thuộc tính lạ; thêm chú thích này (hoặc cấu hình toàn cục) để giải tuần tự hóa khoan dung hơn.
Câu hỏi thường gặp
Trong hầu hết trường hợp là Jackson, đây là mặc định của Spring, nhanh hơn và hỗ trợ đa hình phong phú hơn. Gson nhẹ hơn và được biết đến nhiều hơn trên Android, dù các dự án Android ngày càng dùng Moshi hoặc kotlinx.serialization.
Lombok loại bỏ nhiều mã lặp (getter, setter, equals, hashCode, builder). Nó được dùng rộng rãi nhưng cần annotation processor của Lombok trong quá trình build. Hãy tắt nó nếu dự án của bạn tránh Lombok vì lý do gọn gàng phụ thuộc.
Các trường là null trong bất kỳ mẫu quan sát nào sẽ trở thành kiểu bao bọc (Integer thay vì int) để có thể chứa null. Khi đó Jackson giải tuần tự hóa "age": null không lỗi. Thêm @JsonInclude(Include.NON_NULL) để bỏ qua null khi tuần tự hóa.
Có, nếu bạn chọn “record”. Record ngắn gọn, bất biến và hoạt động với Jackson 2.12+. Với các dự án Spring Boot 3, kết hợp record với việc tạo mã không cần Lombok là lựa chọn hiện đại.
Công cụ liên quan
Bảng tham chiếu ASCII
Bảng ASCII đầy đủ từ 0 đến 127 với giá trị thập phân, thập lục phân, bát phân, nhị phân và ký hiệu tham chiếu ký tự số HTML, gồm NUL, LF và DEL.
Tham chiếu ký tự HTML
Danh sách có thể tìm kiếm các thực thể HTML, mã tên và mã số tương ứng của chúng, cùng chức năng sao chép chỉ với một cú nhấp cho các ký tự đặc biệt và biểu tượng.
Bảng tham khảo phím tắt
Tìm phím tắt mặc định theo tài liệu của VS Code, Chrome và Bash dùng GNU Readline trên macOS, Windows và Linux.
Bảng tra cứu nhanh Markdown
Tài liệu Markdown thực dụng với bản xem trước thực tế và ví dụ có thể sao chép cho tiêu đề, danh sách, bảng, mã, liên kết, hình ảnh và cú pháp GFM.
Trình định dạng HTML
Định dạng HTML cục bộ trong trình duyệt với thụt lề hai hoặc bốn khoảng trắng. HTML không được tải lên hoặc xác thực.
Công cụ đổi PX sang PT
Đổi giá trị pixel CSS không âm sang điểm chữ theo công thức 1 px = 0,75 pt. Kết quả hiển thị tối đa bốn chữ số thập phân.
Công cụ này có phiên bản bằng các ngôn ngữ khác
- JSON ke Kelas Java [ID]
- JSON a Clase Java [ES]
- JSON เป็นคลาส Java [TH]
- JSON naar Java-klasse [NL]
- JSON zu Java-Klasse [DE]
- JSON을 Java 클래스로 [KO]
- JSON na klasę Java [PL]
- JSON para Classe Java [PT]
- JSON إلى فئة Java [AR]
- JSON till Java-klass [SV]
- JSON から Java クラスへ [JA]
- JSON vers classe Java [FR]
- JSON в класс Java [RU]
- JSON'dan Java Sınıfına [TR]
- JSON 转 Java 类 [ZH]
- JSON to Java Class [EN]
- JSON in classe Java [IT]