"नमस्कार मित्रा!"

"अरे, दिएगो."

"मी येथे पाहतो की तुम्ही JSON सीरियलायझेशनच्या मूलभूत गोष्टी शिकलात?"

"तुला 'बेसिक' म्हणजे काय? मला खूप माहिती आहे!"

"खूप भोळसट. तुला त्यातला अर्धा भाग माहीत नाही. दहा टक्के उत्तम."

"तू गंमत करत आहेस. अजून काय आहे?"

"ऑब्जेक्ट पदानुक्रमाचे डीसीरियलायझेशन (पॉलीमॉर्फिक डीसीरियलायझेशन), संग्रहांचे डीसीरियलायझेशन आणि बरेच काही! जॅक्सन फ्रेमवर्क मोठा आणि शक्तिशाली आहे. प्रामाणिकपणे, तुम्ही फक्त पृष्ठभागावर स्क्रॅच करण्यास सुरुवात केली आहे."

"ठीक आहे, मग मला त्याबद्दल सांग - मी सर्व कान आहे."

"प्रत्येक धड्याने हुशार होण्यात मला खरोखर आनंद आहे!"

"ठीक आहे, माझ्या रोबोट मित्रा, मदत करण्यात मला आनंद झाला!"

"तुम्ही तयार आहात का? मग ऐका."

"तुम्ही आधीच शिकल्याप्रमाणे, अनुक्रमणिका आणि डीसीरियलायझेशन या दोन्हीसाठी भाष्ये वापरली जातात. व्यवहारात, सीरियलायझेशनला डीसीरियलायझेशनपेक्षा खूपच कमी माहिती आवश्यक असते. उदाहरणार्थ:"

जावा वर्ग 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": []
}

"अॅरे, अॅरेलिस्ट, लिंक्डलिस्ट आणि इतर वर्गांची उदाहरणे JSON अॅरेमध्ये बदलली आहेत."

"परंतु जेव्हा तुम्ही JSON अॅरे डिसिरियलाइज करता तेव्हा तुम्ही कोणता ऑब्जेक्ट तयार करावा: अॅरेलिस्ट किंवा लिंक्डलिस्ट?"

"बरोबर. जर एखादा वर्ग सदस्य इंटरफेस असेल (उदा. सार्वजनिक यादी<Cat> cats ), त्याला कोणत्या वस्तूचे श्रेय द्यायचे?"

"आम्ही फील्डमध्ये अतिरिक्त भाष्ये जोडू शकतो किंवा डीसीरियलायझेशन दरम्यान लक्ष्य वर्ग स्पष्टपणे सूचित करू शकतो. हे उदाहरण पहा:"

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));
}
एक वर्ग ज्याचे ऑब्जेक्ट्स JSON वरून डीसीरियल केले आहेत
@JsonAutoDetect
class Cat {
 public String name;
 public List<Cat> cats = new ArrayList<>();
 Cat() {
 }
}

"दुसर्‍या शब्दात, आम्ही मॅपरचे दुसरे पॅरामीटर वापरू शकतो . deserialization दरम्यान वापरण्यासाठी वर्गांची यादी पास करण्यासाठी readValue पद्धत."

"मला ते आवडते. ते सोयीस्कर आहे. त्यामुळे तुम्हाला जेएसओएन अ‍ॅरेला जे काही हवे आहे, अ‍ॅरेलिस्ट किंवा लिंक्डलिस्टमध्ये डीसीरियलाइज करू शकता.

"तुम्ही भाष्य वापरून उल्लेख केला आहे. तुम्ही ते कसे करता?"

"हे सोपे आहे. उदाहरणार्थ:"

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);
}
एक वर्ग ज्याचे ऑब्जेक्ट्स JSON वरून डीसीरियल केले आहेत
@JsonAutoDetect
class Cat
{
 public String name;
 @JsonDeserialize(as = ArrayList.class, contentAs = Cat.class)
 public List<Cat> cats = new ArrayList<>();
 Cat() {
 }
}

"आम्ही फक्त @JsonDeserialize(as = ArrayList.class, contentAs = Cat.class) हे भाष्य ओळ 5 मध्ये जोडतो जेणेकरून सूची इंटरफेसची कोणती अंमलबजावणी वापरायची आहे हे दर्शविण्यासाठी."

"अहो. मी बघतो. ते खरच खूप सोपे आहे."

"पण अजून बरेच काही आहे. समजा सूचीमधील डेटा प्रकार देखील एक इंटरफेस आहे! तुम्ही काय कराल?"

"आम्ही इथेही भाष्य वापरतो का?"

"होय, तेच. तुम्ही पॅरामीटर प्रकार दर्शविण्यासाठी देखील वापरू शकता. याप्रमाणे:"

संग्रह प्रकार डेटा प्रकार कसा सेट करायचा
यादी @JsonDeserialize(contentAs = ValueTypeImpl.class)
नकाशा @JsonDeserialize(keyAs = KeyTypeImpl.class)

"छान! आम्ही अंदाज करू शकत नाही अशा विविध परिस्थितींसाठी खरोखर खूप भाष्ये आवश्यक आहेत."

"एवढेच नाही. आणि तेच आम्हाला मुख्य मार्गावर आणते: वास्तविक प्रकल्पांमध्ये, वर्गांना बर्‍याचदा समान बेस क्लास किंवा इंटरफेसचा वारसा मिळतो, जो अक्षरशः सर्वत्र वापरला जातो. आणि आता कल्पना करा की तुम्हाला अशा वर्गांचा समावेश असलेली डेटा संरचना डीसीरियल करणे आवश्यक आहे. उदाहरणार्थ:"

ऑब्जेक्ट 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());
}
एक वर्ग ज्याचे ऑब्जेक्ट 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;
}
सीरियलायझेशन परिणाम आणि स्क्रीन आउटपुट:
[
 { "name" : "Missy", "age" : 5},
 { "name" : "Killer", "age" : 8 , "owner" : "Bill Jeferson"}
]

"क्रमांकाच्या निकालाकडे लक्ष द्या."

"आम्ही हा डेटा जावा ऑब्जेक्टमध्ये डीसीरियलाइज करू शकत नाही, कारण तो इतर वर्गांच्या डेटापासून अविभाज्य आहे."

"काही विशिष्ट वैशिष्ट्ये आहेत: कुत्र्याचे मालक फील्ड आहे."

"होय, पण हे फील्ड शून्य असू शकते किंवा सीरिलायझेशन दरम्यान ते पूर्णपणे वगळले जाऊ शकते."

"ठीक आहे, आम्हाला माहीत असलेल्या भाष्यांचा वापर करून आम्ही डेटा प्रकार निर्दिष्ट करू शकत नाही?"

"नाही. डिसीरियलायझेशननंतर, एका संग्रहामध्ये विविध मांजर आणि कुत्र्यांच्या वस्तू, तसेच इतर डझनभर वर्ग असावेत जे पाळीव प्राण्यांकडून वारसा मिळवू शकतात."

"तुम्ही इथे जगात काय करू शकता?"

"येथे दोन गोष्टी वापरल्या आहेत."

"प्रथम, एक विशिष्ट फील्ड दुसर्‍या प्रकारापासून वेगळे करण्यासाठी निवडले जाते. जर एक नसेल, तर ते तयार केले जाते."

"दुसरे, काही विशेष भाष्ये आहेत जी तुम्हाला «पॉलीमॉर्फिक डिसिरियलायझेशन» प्रक्रियेवर नियंत्रण ठेवू देतात. तुम्ही काय करू शकता ते येथे आहे:

ऑब्जेक्ट 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());
}
एक वर्ग ज्याचे ऑब्जेक्ट 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<Pet> pets = new ArrayList<>();
}
सीरियलायझेशन परिणाम आणि स्क्रीन आउटपुट:
{
 "pets" : [
 {"type" : "dog", "name" : "Killer", "age" : 8, "owner" : "Bill Jeferson"},
 {"type" : "cat", "name" : "Missy", "age" : 5}
]
}

भाष्ये वापरून, आम्ही सूचित करतो की JSON प्रतिनिधित्वामध्ये प्रकार नावाचे एक विशेष फील्ड असेल ज्यामध्ये मांजर वर्गासाठी मांजर मूल्य आणि कुत्रा वर्गासाठी मूल्य कुत्रा असेल . ही माहिती ऑब्जेक्ट योग्यरित्या डीसीरियलाइज करण्यासाठी पुरेशी आहे: डीसीरियलायझेशन दरम्यान, ऑब्जेक्टचा प्रकार प्रकार फील्डच्या मूल्याद्वारे निर्धारित केला जाईल.

"कधीकधी वर्गाचे नाव टाइप फील्डचे मूल्य म्हणून वापरले जाते (उदा. «com.example.entity.Cat.class»), परंतु ही एक चांगली सराव नाही. आमच्या JSON प्राप्त करणार्‍या बाह्य अनुप्रयोगाला त्यांची नावे कशी कळतील आमचे वर्ग? वाईट म्हणजे, कधीकधी वर्गांचे नाव बदलले जाते. विशिष्ट वर्ग ओळखण्यासाठी विशिष्ट नाव वापरणे चांगले."

"छान! उसासा. माझ्या लक्षात आले नाही की डीसीरियलायझेशन इतके क्लिष्ट आहे. आणि त्यात खूप काही आहे की तुम्ही छान करू शकता."

"हो. या तुमच्यासाठी नवीन संकल्पना आहेत, पण हे अशा प्रकारचे व्यावहारिक ज्ञान आहे जे तुम्हाला एक हुशार प्रोग्रामर बनवेल."

"अमिगो मस्त प्रोग्रामर आहे. मस्त!"

"ठीक आहे. जा आणि ब्रेक घ्या."