"হাই বন্ধু!"

"আরে, দিয়েগো।"

"আমি এখানে দেখছি আপনি 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 অ্যারেকে ডিসিরিয়ালাইজ করেন, তখন আপনার কোন বস্তু তৈরি করা উচিত: একটি অ্যারেলিস্ট বা লিঙ্কডলিস্ট?"

"ঠিক আছে। যদি একজন ক্লাস মেম্বার একটি ইন্টারফেস হয় (যেমন পাবলিক List<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() {
 }
}

"অন্য কথায়, আমরা ম্যাপারের দ্বিতীয় প্যারামিটারটি ব্যবহার করতে পারি । ডিসিরিয়ালাইজেশনের সময় ব্যবহার করার জন্য ক্লাসের তালিকা পাস করতে readValue পদ্ধতি।"

"আমি এটি পছন্দ করি। এটি সুবিধাজনক। তাই আপনি আপনার যা প্রয়োজন, একটি অ্যারেলিস্ট বা লিঙ্কডলিস্টে একটি JSON অ্যারেকে ডিসিরিয়ালাইজ করতে পারেন।

"আপনি টীকা ব্যবহার করে উল্লেখ করেছেন। আপনি কিভাবে তা করবেন?"

"এটা সহজ। যেমন:"

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() {
 }
}

" লিস্ট ইন্টারফেসের কোন ইমপ্লিমেন্টেশন ব্যবহার করতে হবে তা নির্দেশ করতে আমরা লাইন 5-এ @JsonDeserialize(as = ArrayList.class, contentAs = Cat.class) টিকা যোগ করি ।"

"আহ. আমি দেখছি. এটা সত্যিই বেশ সহজ।"

"কিন্তু আরও কিছু আছে। ধরুন একটি তালিকার ডেটা টাইপও একটি ইন্টারফেস! আপনি কী করবেন?"

"আমরা কি এখানেও একটি টীকা ব্যবহার করি?"

"হ্যাঁ, একই। আপনি প্যারামিটারের ধরন নির্দেশ করতেও এটি ব্যবহার করতে পারেন। এর মত:"

সংগ্রহের ধরন কিভাবে ডেটা টাইপ সেট করবেন
তালিকা @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 প্রাপ্ত একটি বহিরাগত অ্যাপ্লিকেশন কীভাবে নাম জানবে আমাদের ক্লাস? আরও খারাপ, ক্লাসের নামকরণ করা হয় মাঝে মাঝে। একটি নির্দিষ্ট শ্রেণী সনাক্ত করতে কিছু অনন্য নাম ব্যবহার করা ভাল।"

"ঠাণ্ডা! দীর্ঘশ্বাস। আমি বুঝতে পারিনি যে ডিসিরিয়ালাইজেশন এত জটিল ছিল। এবং আপনি ঠিক-টিউন করতে পারেন এমন অনেক কিছু আছে।"

"হ্যাঁ। এগুলি আপনার জন্য নতুন ধারণা, কিন্তু এই ধরনের ব্যবহারিক জ্ঞান যা আপনাকে একজন প্রতিভাধর প্রোগ্রামার করে তুলবে।"

"অ্যামিগো একজন দুর্দান্ত প্রোগ্রামার। দুর্দান্ত!"

"ঠিক আছে। যাও এবং একটু বিরতি নাও।"