"Hai, Amigo!"

"Hai, Ellie!"

"Memandangkan anda telah diperkenalkan dengan JSON, mari kita bercakap lebih lanjut mengenainya hari ini."

"OK. Di mana ia biasanya digunakan?"

"Begini cara ia biasanya berfungsi. Seseorang (pelanggan) meminta data daripada program Java (pelayan). Program ini mencipta objek Java dan mengisinya dengan maklumat daripada pangkalan data. Ia kemudian menukarnya ke dalam format yang peminta (pelanggan). ) boleh memahami, seperti JSON, dan menghantarnya kembali."

"Biar saya beritahu anda cara bekerja dengan JSON dalam Java. Pada asasnya, kita hanya perlu melakukan dua perkara: mensiri objek Java ke dalam format JSON dan menyahsiri objek Java daripada format JSON."

"Dengan kata lain, JSON ialah standard untuk menghantar mesej/data dari satu program ke program yang lain. Terdapat banyak standard seperti itu. Tetapi jika program itu ditulis dalam JavaScript, ia biasanya cuba menggunakan JSON."

"OK. Saya sudah bersedia."

"Hebat. Kalau begitu mari kita mulakan."

Pensirian ke dalam JSON - 1

"Seperti yang anda sedia maklum, Java mempunyai alat siri standard terbina dalam. Tetapi mereka tidak menyokong JSON. Jadi, jika anda perlu mensirikan objek ke dalam JSON, anda boleh menggunakan salah satu rangka kerja (perpustakaan) popular yang tahu cara untuk melakukan ini."

"Apakah perbezaan antara rangka kerja yang berbeza ini?"

"Ia biasanya berbeza dalam tahap kerumitan mereka: terdapat rangka kerja yang hanya boleh melakukan yang paling asas, tetapi ia sangat kecil dan mudah. ​​Dan terdapat rangka kerja kompleks besar yang boleh melakukan lebih banyak lagi."

"Jackson ialah salah satu rangka kerja yang paling popular. Kami akan menggunakannya sebagai contoh semasa kami melihat cara bekerja dengan JSON."

"Pertama, anda perlu memuat turun rangka kerja ini dan menambahkannya pada projek anda. Anda perlu melakukan ini secara langsung dalam IntelliJ IDEA. Anda boleh memuat turun rangka kerja menggunakan pautan ini ."

"Selesai."

"Bagus. Mari kita sambung, kalau begitu."

"Menukar objek Java kepada JSON adalah semudah mensirikannya. Untuk melakukan ini, terdapat kelas ObjectMapper khas (com.fasterxml.jackson.databind.ObjectMapper)."

"Biar saya tunjukkan kepada anda contoh yang berfungsi, dan kemudian kami akan menganalisisnya:"

Tukar objek kepada 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 ditukar kepada JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Hasil siri dan output skrin:
{"name":"Missy", "age":5, "weight":4}

"Begini cara ia berfungsi:"

"Dalam baris 4-7, kami mencipta objek Cat dan mengisinya dengan data."

"Dalam baris 10, kami mencipta objek Penulis di mana kami akan menulis perwakilan rentetan JSON bagi objek itu."

"Dalam baris 13, kami mencipta objek ObjectMapper yang akan melaksanakan semua siri."

"Dalam baris 16, kami menulis perwakilan JSON objek kucing kepada penulis ."

"Dalam baris 19-20, kami memaparkan hasilnya pada skrin."

"Semuanya kelihatan agak mudah. ​​Tidak lebih sukar daripada bersiri asli di Jawa."

"Apakah rupa penyahserialisasian?"

"Ia hampir sama, cuma lebih pendek:"

Tukar objek daripada 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 dinyahsiri daripada format JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Lebih mudah lagi. Kami mengambil ObjectMapper dan menghantarnya rentetan atau StringReader dengan JSON, serta kelas objek yang akan dinyahsiri . Kemudian kami memanggil kaedah readValue , dan sebagai output kami mendapat objek Java siap pakai dengan semua data."

"Nah, itu sama seperti penyahserialisasian di Jawa."

"Hampir. Terdapat beberapa keperluan yang diletakkan pada objek yang disiri ke dalam, atau dinyahsiri daripada, JSON:"

" 1)  medan mesti kelihatan: mereka mesti sama ada awam atau mempunyai getter dan setter"

" 2)  mesti ada pembina lalai (satu tanpa parameter)"

"Saya faham. Itu tidak terlalu menghairankan. Tetapi Java menyusun segala-galanya, malah bidang persendirian."

"Nah, itu Java. Ia mempunyai akses kepada data tersembunyi. Anda tidak boleh bersembunyi daripada diri anda sendiri."

"Terdapat aspek ketiga di sini. Saya harap anda perasan anotasi @JsonAutoDetect pada kelas Cat?"

"Yep. Saya baru nak tanya apa benda tu."

"Ia adalah anotasi: maklumat pengemasan untuk rangka kerja Jackson. Dengan menggunakan anotasi yang betul, anda mempunyai banyak kawalan fleksibel ke atas hasil bersiri ke dalam JSON."

"Cool! Apa jenis anotasi yang ada?"

"Berikut adalah beberapa contoh:"

Anotasi Penerangan
@JsonAutoDetect Diletakkan sebelum kelas.
Menandai kelas sebagai sedia untuk disiri ke dalam JSON.
@JsonAbaikan Diletakkan sebelum hartanah.
Harta ini akan diabaikan semasa bersiri.
@JsonProperty Diletakkan sebelum harta atau pengambil atau penetap. Membolehkan anda menentukan nama medan yang berbeza semasa bersiri.
@JsonWriteNullProperties Diletakkan sebelum kelas.
Medan objek yang batal tidak akan diabaikan.
@JsonPropertyOrder Diletakkan sebelum kelas.
Membolehkan anda menentukan susunan medan semasa bersiri.

"Menariknya! Ada lagi ke?"

"Terdapat banyak. Tetapi kami tidak akan membincangkannya sekarang. Sekarang mari kita mengolah semula contoh pertama kami sedikit:"

Tukar objek kepada 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 ditukar kepada JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Hasil siri dan output skrin:
{"age":5, "alias":"Missy"}

"Kod itu tetap sama, tetapi saya menukar anotasi: Saya menetapkan nama lain untuk medan nama: alias. Saya juga menanda medan berat sebagai Abaikan, yang menyebabkan objek JSON berubah."

"Adalah bagus anda boleh menyesuaikan segala-galanya seperti itu. Saya rasa saya pasti akan mendapati ini berguna."

"Dan penyahserikatan akan memahami cara untuk bekerja dengan ini? Apabila penyahserikatan daripada JSON ke objek Java, nilai medan alias akan ditulis pada medan nama objek Cat?"

"Ya, penyahserikatan akan berfungsi sebagaimana mestinya. Ia pintar."

"Apa yang tidak menggembirakan kemudian."

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