Thay đổi Tên trường JSON bằng Jackson trong Java

Jackson là một thư viện rất phổ biến để xử lý JSON và tuần tự hóa / deserialization nói chung trong các dự án dựa trên Java và Spring Boot.

Jackson xử lý tên thuộc tính bằng cách ánh xạ chúng sang JSON – vì vậy propertyName trong một POJO sẽ có một propertyName trong JSON. Quy ước này cũng được tuân theo khi chuyển đổi JSON sang POJO và nếu tên không khớp thì quá trình chuyển đổi sẽ không thể thực hiện được.

Tuy nhiên, có nhiều trường hợp bạn muốn các thuộc tính JSON được tuần tự hóa có các tên khác nhau, chẳng hạn như tiêu chuẩn hóa quy ước đặt tên cho các dịch vụ khác (sử dụng các trường hợp như snake_case, Thay vì CamelCase) hoặc tên thuộc tính xung đột (a Customer có thể có một firstName, giống như một Agent – và một báo cáo có thể chứa cả hai firstName thuộc tính và cần phải được tuần tự hóa).

Hãy tạo ra một Book lớp, với một số trường đơn giản:

public class Book {
    private String title;
    private String author;
    private int releaseYear;
    
    public Book() {}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

Thay đổi tên trường JSON với Jackson

Khi thường chuyển đổi một phiên bản của một Book vào JSON, chúng ta sẽ viết giá trị của đối tượng dưới dạng chuỗi JSON bằng cách sử dụng ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Kết quả này trong:

{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}

Sản phẩm title, authorreleaseYear là một ánh xạ 1-1 tới title, authorreleaseYear các lĩnh vực của POJO. Để thay đổi tên của thuộc tính JSON và giữ lại tên đó sau khi tuần tự hóa, bạn không cần phải thay đổi POJO! Chỉ cần chú thích trường liên quan bằng @JsonPropertyvà cung cấp tên JSON:

public class Book {
    @JsonProperty("book_title")
    private String title;
    @JsonProperty("book_author")
    private String author;
    @JsonProperty("book_release_year")
    private int releaseYear;
    
    public Book(){}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

Bây giờ, khi chúng ta khởi tạo đối tượng và chuyển đổi nó thành JSON:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Đoạn mã dẫn đến:

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

Thay đổi Tên trường JSON trong Chuyển đổi JSON-to-POJO?

Điều đáng chú ý là việc thay đổi tên không phải là một chiều. Chú thích giống nhau hoạt động theo cả hai cách và có thể kết nối JSON đến với các tên khác nhau thành một đối tượng hợp lệ. Chẳng hạn, một JSON đại diện cho một cuốn sách có book_title, sẽ không được ánh xạ tới title tài sản của Book class theo mặc định vì chúng không giống nhau.

Vì chúng tôi đã chú thích title as book_title – quá trình chuyển đổi hoạt động tốt:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

Kết quả này trong:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

Lưu ý: Để tạo một đối tượng từ JSON, lớp của bạn cũng cần phải có một phương thức khởi tạo trống. Đầu tiên Jackson khởi tạo đối tượng trống, sau đó điền vào các trường bằng cách sử dụng getters và setters.

Chú thích Getters và Setters với @JsonProperty

Bạn có muốn mã hóa các tên khác nhau để tuần tự hóa và giải mã hóa không? Ví dụ: bạn có thể tuần tự hóa Book thành một JSON với bt biểu thị tiêu đề của cuốn sách, nhưng sử dụng JSON bằng book_title. Bạn có thể tùy chỉnh getters và setters của Book lớp học với @JsonProperty chú thích:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

Bằng cách này, khi được đăng nhiều kỳ, getBt() phương thức sẽ tuần tự hóa title như là một bt trường trong JSON. Khi đọc từ JSON (giải tuần tự hóa), bạn sẽ cần cung cấp một book_title, được ánh xạ tới title.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Lưu ý: Cả hai btbook_title sẽ được ánh xạ tới title trường, nhưng điều này không làm cho btbook_title có thể hoán đổi cho nhau. Jackson sẽ không thể chuyển đổi giữa chúng nếu không chuyển đổi sang title.

Bây giờ, bạn có thể khởi tạo một cuốn sách, tuần tự hóa nó và giải mã hóa một Chuỗi khác thành một cuốn sách với:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);


String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);


String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);

Kết quả này trong:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

Kết luận

Trong hướng dẫn ngắn này, chúng ta đã xem cách Jackson ánh xạ các trường đối tượng thành JSON và cách bạn có thể thay đổi tên của các trường trước khi tuần tự hóa. Chúng tôi cũng đã khám phá ý tưởng sử dụng các tên JSON khác nhau để tuần tự hóa và giải tuần tự hóa, bằng cách sử dụng @JsonProperty chú thích ở cấp phương pháp, thay vì cấp trường.

Dấu thời gian:

Thêm từ xếp chồng lên nhau