Ubah Nama Bidang JSON dengan Jackson di Java

Jackson adalah pustaka yang sangat umum untuk menangani JSON dan serialisasi/deserialisasi secara umum di proyek berbasis Java dan Spring Boot.

Jackson menangani nama properti dengan memetakannya sebagaimana adanya ke JSON โ€“ jadi propertyName dalam POJO akan memiliki yang sesuai propertyName di JSON. Konvensi ini juga diikuti saat mengonversi JSON ke POJO, dan jika namanya tidak cocok, konversi tidak dapat dilakukan.

Namun, ada banyak kasus di mana Anda ingin properti JSON serial memiliki nama yang berbeda, seperti standarisasi konvensi penamaan untuk layanan lain (menggunakan kasus seperti snake_case, dari pada CamelCase) atau nama properti yang bertentangan (a Customer dapat memiliki firstName, sama seperti Agent โ€“ dan laporan mungkin berisi keduanya firstName properti dan perlu diserialisasi).

Mari buat Book kelas, dengan beberapa bidang sederhana:

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;
    }
    
}

Ubah Nama Bidang JSON dengan Jackson

Saat biasanya mengonversi instance dari a Book ke JSON, kami akan menulis nilai objek sebagai string JSON menggunakan ObjectMapper:

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

Ini menghasilkan:

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

Grafik title, author dan releaseYear adalah pemetaan 1-ke-1 ke title, author dan releaseYear bidang POJO. Untuk mengubah nama properti JSON dan mempertahankannya setelah serialisasi, tidak perlu mengubah POJO Anda! Cukup dengan membubuhi keterangan pada bidang yang relevan dengan @JsonProperty, dan berikan nama 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;
    }
    
}

Sekarang, ketika kita membuat instance objek dan mengonversinya menjadi JSON:

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

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

Kode menghasilkan:

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

Ubah Nama Bidang JSON dalam Konversi JSON-ke-POJO?

Perlu dicatat bahwa perubahan nama tidak sepihak. Anotasi yang sama berfungsi dua arah, dan dapat menjembatani JSON yang masuk dengan nama berbeda menjadi objek yang valid. Misalnya, JSON yang mewakili buku dengan book_title, tidak akan dipetakan ke title properti dari Book kelas secara default, karena mereka tidak sama.

Karena kami telah membuat anotasi title as book_title โ€“ konversi berfungsi dengan baik:

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

Ini menghasilkan:

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

Catatan: Untuk membuat objek dari JSON, kelas Anda juga harus memiliki konstruktor kosong. Jackson pertama-tama membuat instance objek kosong, lalu mengisi bidang menggunakan getter dan setter.

Anotasi Getter dan Setter dengan @JsonProperty

Apakah Anda ingin menyandikan nama yang berbeda untuk serialisasi dan deserialisasi? Misalnya, Anda dapat membuat cerita bersambung Book menjadi JSON dengan bt menunjukkan judul buku, tetapi menggunakan JSON dengan book_title. Anda dapat menyesuaikan getter dan setter dari Book kelas dengan @JsonProperty penjelasan:

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

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

Dengan cara ini, ketika diserialkan, getBt() metode akan membuat serial title sebagai bt bidang di JSON. Saat membaca dari JSON (deserialisasi), Anda harus menyediakan a book_title, yang dipetakan ke title.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Catatan: Kedua bt dan book_title akan dipetakan ke title lapangan, tapi ini tidak membuat bt dan book_title dipertukarkan. Jackson tidak akan dapat mengonversi di antara mereka tanpa terlebih dahulu mengonversi ke title.

Sekarang, Anda dapat membuat instance buku, membuat serial, dan membatalkan serialisasi String lain menjadi buku dengan:

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

Ini menghasilkan:

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

Kesimpulan

Dalam tutorial singkat ini, kita telah melihat bagaimana Jackson memetakan bidang objek ke JSON, dan bagaimana Anda dapat mengubah nama bidang sebelum serialisasi. Kami juga telah menjelajahi ide menggunakan nama JSON yang berbeda untuk serialisasi dan deserialisasi, menggunakan @JsonProperty anotasi pada tingkat metode, bukan tingkat bidang.

Stempel Waktu:

Lebih dari penyalahgunaan