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. 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. 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. 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. 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. 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)

Lỗi thường gặp

  • Dùng kiểu nguyên thủy cho trường có thể là null. int không thể là null; Jackson sẽ ném lỗi nếu JSON có "age": null. Hãy dùng Integer.
  • Thiếu mô-đun ngày. Jackson cần jackson-datatype-jsr310 cho Instant/LocalDate. Không có nó, ngày sẽ lùi về String hoặ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ó Address lồng nhau, trình tạo sẽ tạo hai lớp Address. 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

Công cụ này có phiên bản bằng các ngôn ngữ khác