"Hai, Amigo!"

"Hai, Elli!"

"Karena Anda sudah diperkenalkan dengan JSON, mari kita bicarakan lebih lanjut hari ini."

"Oke. Di mana biasanya digunakan?"

"Begini cara kerjanya. Seseorang (klien) meminta data dari program Java (server). Program membuat objek Java dan mengisinya dengan informasi dari database. Kemudian mengubahnya menjadi format yang diminta oleh pemohon (klien). ) dapat memahami, seperti JSON, dan mengirimkannya kembali."

"Izinkan saya memberi tahu Anda cara bekerja dengan JSON di Java. Intinya, kita hanya perlu melakukan dua hal: membuat serial objek Java ke dalam format JSON, dan menghapus serial objek Java dari format JSON."

"Dengan kata lain, JSON adalah standar pengiriman pesan/data dari satu program ke program lain. Standar seperti itu banyak sekali. Tapi kalau programnya ditulis dengan JavaScript, biasanya mencoba menggunakan JSON."

"Baik saya siap."

"Bagus. Kalau begitu mari kita mulai."

Serialisasi ke JSON - 1

"Seperti yang sudah Anda ketahui, Java memiliki alat serialisasi standar bawaan. Tetapi mereka tidak mendukung JSON. Jadi, jika Anda perlu membuat serial objek menjadi JSON, Anda dapat menggunakan salah satu kerangka kerja (library) populer yang mengetahui cara melakukannya melakukan hal ini."

"Apa perbedaan antara kerangka kerja yang berbeda ini?"

"Mereka biasanya berbeda dalam tingkat kerumitannya: ada kerangka kerja yang hanya dapat melakukan hal yang sangat mendasar, tetapi sangat kecil dan sederhana. Dan ada kerangka kerja kompleks yang besar yang dapat melakukan lebih banyak lagi."

"Jackson adalah salah satu framework paling populer. Kami akan menggunakannya sebagai contoh saat kami melihat cara bekerja dengan JSON."

"Pertama, Anda perlu mengunduh kerangka kerja ini dan menambahkannya ke proyek Anda. Anda perlu melakukannya langsung di IntelliJ IDEA. Anda dapat mengunduh kerangka kerja menggunakan tautan ini ."

"Selesai."

"Bagus. Kalau begitu, ayo lanjutkan."

"Mengubah objek Java menjadi JSON semudah membuat serialisasi. Untuk melakukan ini, ada kelas ObjectMapper khusus (com.fasterxml.jackson.databind.ObjectMapper)."

"Izinkan saya menunjukkan kepada Anda contoh yang berfungsi, dan kemudian kami akan menganalisisnya:"

Mengonversi objek ke JSON"
public static void main(String[] args) throws IOException
{
 // Create an object to be serialized into JSON
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // This is the Jackson object that performs the serialization
 ObjectMapper mapper = new ObjectMapper();

 // And here's the serialization itself: the first argument is where, and the second is what
 mapper.writeValue(writer, cat);

 // Convert everything written to the StringWriter into a String
 String result = writer.toString();
 System.out.println(result);
}
Kelas Cat yang objeknya dikonversi ke JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Hasil serialisasi dan output layar:
{"name":"Missy", "age":5, "weight":4}

"Begini cara kerjanya:"

"Pada baris 4-7, kita membuat objek Cat dan mengisinya dengan data."

"Pada baris 10, kita membuat objek Writer di mana kita akan menulis representasi string-JSON dari objek tersebut."

"Pada baris 13, kami membuat objek ObjectMapper yang akan melakukan semua serialisasi."

"Pada baris 16, kita menulis representasi JSON dari objek cat ke writer ."

"Pada baris 19-20, kami menampilkan hasilnya di layar."

"Semuanya terlihat sangat sederhana. Tidak lebih sulit dari serialisasi asli di Jawa."

"Seperti apa deserialisasi itu?"

"Hampir sama, hanya lebih pendek:"

Mengonversi objek dari JSON
public static void main(String[] args) throws IOException
{
 String jsonString = "{ \"name\":\"Missy\", \"age\":5, \"weight\":4}";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
Kelas yang objeknya dideserialisasi dari format JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Bahkan lebih mudah. ​​Kami mengambil ObjectMapper dan meneruskannya string atau StringReader dengan JSON, serta kelas objek yang akan dideserialisasi . Kemudian kami memanggil metode readValue , dan sebagai output kami mendapatkan objek Java siap pakai dengan semua datanya."

"Yah, persis seperti deserialisasi di Jawa."

"Hampir. Ada beberapa persyaratan yang ditempatkan pada objek yang diserialkan ke, atau dideserialisasi dari, JSON:"

" 1)  bidang harus terlihat: harus bersifat publik atau memiliki pengambil dan penyetel"

" 2)  harus ada konstruktor default (tanpa parameter)"

"Begitu. Itu tidak terlalu mengejutkan. Tapi Java membuat serial semuanya, bahkan bidang pribadi."

"Yah, itu Java. Itu memiliki akses ke data tersembunyi. Kamu tidak bisa bersembunyi dari dirimu sendiri."

"Ada aspek ketiga di sini. Saya harap Anda memperhatikan anotasi @JsonAutoDetect di kelas Cat?"

"Ya. Aku baru saja akan bertanya apa itu."

"Ini adalah anotasi: informasi tata graha untuk kerangka kerja Jackson. Dengan menggunakan anotasi yang tepat, Anda memiliki kontrol yang cukup fleksibel atas hasil serialisasi ke dalam JSON."

"Keren! Anotasi macam apa yang ada?"

"Ini beberapa contohnya:"

Anotasi Keterangan
@JsonAutoDetect Ditempatkan di depan kelas.
Menandai kelas sebagai siap untuk diserialisasikan ke dalam JSON.
@JsonAbaikan Ditempatkan sebelum properti.
Properti akan diabaikan selama serialisasi.
@JsonProperti Ditempatkan sebelum properti atau pengambil atau penyetel. Memungkinkan Anda menentukan nama bidang yang berbeda selama serialisasi.
@JsonWriteNullProperties Ditempatkan di depan kelas.
Bidang objek yang null tidak akan diabaikan.
@JsonPropertyOrder Ditempatkan di depan kelas.
Memungkinkan Anda menentukan urutan bidang selama serialisasi.

"Menarik sekali! Apakah ada lagi?"

"Ada banyak. Tapi kita tidak akan membahasnya sekarang. Sekarang mari kita ulang sedikit contoh pertama kita:"

Mengkonversi objek ke JSON
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 StringWriter writer = new StringWriter();

 ObjectMapper mapper = new ObjectMapper();

 mapper.writeValue(writer, cat);

 String result = writer.toString();
 System.out.println(result);
}
Kelas yang objeknya diubah menjadi JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Hasil serialisasi dan output layar:
{"age":5, "alias":"Missy"}

"Kodenya tetap sama, tetapi saya mengubah anotasinya: Saya menetapkan nama lain untuk bidang nama: alias. Saya juga menandai bidang bobot sebagai Abaikan, yang menyebabkan objek JSON berubah."

"Bagus kalau kamu bisa menyesuaikan semuanya seperti itu. Kupikir aku pasti akan menganggap ini berguna."

"Dan deserialization akan mengerti bagaimana bekerja dengan ini? Ketika deserialisasi dari JSON ke objek Java, nilai bidang alias akan ditulis ke bidang nama objek Cat?"

"Ya, deserialisasi akan berfungsi sebagaimana mestinya. Ini cerdas."

"Apa yang tidak membuat senang kalau begitu."

"Terima kasih untuk pelajaran yang menarik ini, Ellie."