"Halo, konco!"

"Hai, Diego."

"Aku weruh ing kene sampeyan wis sinau dhasar serialisasi JSON?"

"Apa maksudmu 'dasar'? Aku ngerti akeh!"

"Dadi naif. Sampeyan ora ngerti setengah saka iku. Sepuluh persen paling apik."

"Kowe ngguyu. Ana apa maneh?"

"Deserialization saka hirarki obyek (deserialization polymorphic), deserialization saka koleksi, lan akeh liyane! Framework Jackson gedhe lan kuat. Jujur, sampeyan mung wiwit ngeruk lumahing.

"Oke, banjur critakna babagan iki - aku kabeh kuping."

"Aku pancene seneng dadi luwih pinter saben pelajaran!"

"Wah, aku seneng mbantu, kanca robotku!"

"Sampeyan wis siyap? Banjur rungokna."

"Kaya sing wis sampeyan sinau, anotasi digunakake kanggo serialisasi lan deseralisasi. Ing laku, serialisasi mbutuhake informasi sing luwih sithik tinimbang deseralisasi. Contone: "

kelas Jawa JSON
class Cat
{
 public String name = "missy";
 public Cat[] cats = new Cat[0];
}
{
 "name": "missy",
 "cats": []
}
class Cat
{
 public String name = "missy";
 public List cats = new ArrayList<Cat>();
}
{
 "name": "missy",
 "cats": []
}
class Cat
{
 public String name = "missy";
 public List cats = new LinkedList<Cat>();
}
{
 "name": "missy",
 "cats": []
}

"Instance Array, ArrayList, LinkedList, lan kelas liyane diowahi dadi array JSON."

"Nanging nalika sampeyan deserialize array JSON, obyek apa sampeyan kudu nggawe: ArrayList utawa LinkedList?"

"Bener. Yen anggota kelas minangka antarmuka (eg Public List<Cat> cats ), obyek apa sing kudu digandhengake karo iku?"

"Kita bisa nambah anotasi tambahan menyang lapangan utawa kanthi jelas nunjukake kelas target sajrone deseralisasi. Deleng conto iki:"

Ngonversi obyek saka JSON
public static void main(String[] args) throws IOException
{
 String jsonString = ""{\"name\":\"Missy\",\"cats\":[{\"name\":\"Timmy\"},{\"name\":\"Killer\"}]}"";
 StringReader reader = new StringReader(jsonString);
 ObjectMapper mapper = new ObjectMapper();
 Cat cat = mapper.readValue(reader, TypeFactory.collectionType(ArrayList.class, Cat.class));
}
Kelas sing obyek deserialized saka JSON
@JsonAutoDetect
class Cat {
 public String name;
 public List&ltCat> cats = new ArrayList<>();
 Cat() {
 }
}

"Ing tembung liyane, kita bisa nggunakake paramèter kapindho mapper . readValue cara kanggo pass dhaftar kelas kanggo nggunakake sak deserialization."

"Aku seneng. Iku trep. Supaya sampeyan bisa deserialize array JSON menyang apa wae sing perlu, ArrayList utawa LinkedList.

"Sampeyan uga nyebutake nggunakake anotasi. Kepiye carane?"

"Gampang. Contone:"

Ngonversi obyek saka JSON
public static void main(String[] args) throws IOException
{
 String jsonString = ""{\"name\":\"Missy\",\"cats\":[{\"name\":\"Timmy\"},{\"name\":\"Killer\"}]}"";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
Kelas sing obyek deserialized saka JSON
@JsonAutoDetect
class Cat
{
 public String name;
 @JsonDeserialize(as = ArrayList.class, contentAs = Cat.class)
 public List&ltCat> cats = new ArrayList<>();
 Cat() {
 }
}

"Kita mung nambah anotasi @JsonDeserialize (minangka = ArrayList.class, contentAs = Cat.class) kanggo baris 5 kanggo nunjukaké kang implementasine saka antarmuka Dhaftar digunakake."

"Ah. Aku ngerti. Sing pancene cukup prasaja."

"Nanging ana liyane. Upaminipun jinis data ing Dhaftar uga antarmuka! Apa sing bakal sampeyan tindakake?"

"Apa kita uga nggunakake anotasi ing kene?"

"Ya, sing padha. Sampeyan uga bisa digunakake kanggo nunjukake jinis parameter. Kaya iki:"

Tipe koleksi Cara nyetel jinis data
Dhaptar @JsonDeserialize(contentAs = ValueTypeImpl.class)
peta @JsonDeserialize(keyAs = KeyTypeImpl.class)

"Keren! Ana akeh anotasi sing dibutuhake kanggo macem-macem kahanan sing ora bisa diantisipasi."

"Ora kabeh. Lan sing ndadekke kita menyang kursus utama: ing proyek nyata, kelas asring diwenehi kelas basa utawa antarmuka sing padha, sing digunakake ing endi wae. Lan saiki mbayangno yen sampeyan kudu deserialize struktur data sing ngemot kelas kasebut. Tuladhane:"

Ngonversi obyek menyang JSON
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;

 Dog dog = new Dog();
 dog.name = "Killer";
 dog.age = 8;
 dog.owner = "Bill Jefferson";

 ArrayList<Pet> pets = new ArrayList<Pet>();
 pets.add(cat);
 pets.add(dog);

 StringWriter writer = new StringWriter();
 ObjectMapper mapper = new ObjectMapper();
 mapper.writeValue(writer, pets);
 System.out.println(writer.toString());
}
Kelas sing obyek diowahi dadi JSON
@JsonAutoDetect
class Pet
{
 public String name;
}

@JsonAutoDetect
class Cat extends Pet
{
 public int age;
}

@JsonAutoDetect
class Dog extends Pet
{
 public int age;
 public String owner;
}
Asil serialisasi lan output layar:
[
 { "name" : "Missy", "age" : 5},
 { "name" : "Killer", "age" : 8 , "owner" : "Bill Jeferson"}
]

"Nggatekake asil serialisasi."

"Kita ora bisa deserialize data iki menyang obyek Jawa, awit iku ateges ora bisa dibedakake saka data kanggo kelas liyane."

"Ana sawetara fitur sing mbedakake: Dog duwe lapangan pemilik."

"Ya, nanging lapangan iki bisa null utawa bisa dilewati kabeh sajrone serialisasi."

"Inggih, kita ora bisa nemtokake jinis data nggunakake anotasi sing kita ngerti?"

"Ora. Sawise deserialization, koleksi siji kudu macem-macem obyek Cat lan Dog, uga rolas kelas liyane sing bisa oleh warisan saka Pet."

"Apa ing donya sampeyan bisa nindakake kene?"

"Loro barang sing digunakake ing kene."

"Kaping pisanan, lapangan tartamtu dipilih kanggo mbedakake jinis siji saka liyane. Yen ora ana, banjur digawe."

"Kapindho, ana anotasi khusus sing ngidini sampeyan ngontrol proses «deserialisasi polimorfik». Iki sing bisa ditindakake:"

Ngonversi obyek menyang JSON
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;

 Dog dog = new Dog();
 dog.name = "Killer";
 dog.age = 8;
 dog.owner = "Bill Jeferson";

 House house = new House();
 house.pets.add(dog);
 house.pets.add(cat);

 StringWriter writer = new StringWriter();
 ObjectMapper mapper = new ObjectMapper();
 mapper.writeValue(writer, house);
 System.out.println(writer.toString());
}
Kelas sing obyek diowahi dadi JSON
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Cat.class, name = "cat"),
@JsonSubTypes.Type(value = Dog.class, name = "dog")
})
class Pet
{
 public String name;
}

class Cat extends Pet
{
 public int age;
}

class Dog extends Pet
{
 public int age;
 public String owner;
}

class House
{
 public List&ltPet> pets = new ArrayList<>();
}
Asil serialisasi lan output layar:
{
 "pets" : [
 {"type" : "dog", "name" : "Killer", "age" : 8, "owner" : "Bill Jeferson"},
 {"type" : "cat", "name" : "Missy", "age" : 5}
]
}

Nggunakake anotasi, kita nuduhake yen perwakilan JSON bakal ngemot lapangan khusus sing diarani jinis sing bakal nyekel kucing nilai kanggo kelas Cat , lan nilai asu kanggo kelas Dog . Informasi iki cukup kanggo deserialize obyek kanthi bener: sajrone deserialization, jinis obyek sing bakal digawe bakal ditemtokake dening nilai kolom jinis.

"Kadhangkala jeneng kelas digunakake minangka nilai kolom jinis (eg «com.example.entity.Cat.class»), nanging iki dudu praktik sing apik. Kepiye carane aplikasi eksternal sing nampa JSON ngerti jeneng kelas kita? Luwih elek, kelas kadhangkala diganti jeneng. Iku luwih apik kanggo nggunakake sawetara jeneng unik kanggo ngenali kelas tartamtu."

"Cool! Sigh. Aku ora ngerti deserialization dadi rumit. Lan ana akeh sing bisa fine-tune."

"Ya. Iki konsep anyar kanggo sampeyan, nanging iki jenis kawruh praktis sing bakal nggawe sampeyan programmer genius."

"Amigo iku programmer sing keren. Keren!"

"Oke. Ayo ngaso."