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