Jackson হল একটি শক্তিশালী লাইব্রেরি যা JSON Serialization এবং Deserialization-এর জন্য ব্যবহৃত হয়। Complex Objects এর ক্ষেত্রে Jackson সঠিকভাবে কাজ করতে পারে, যখন আপনি সঠিকভাবে annotations ব্যবহার করেন। Complex Objects বলতে বোঝানো হয়, যেমন nested objects, collections (List, Map, Set), অথবা inheritance hierarchies (Parent-Child রিলেশনশিপ)। এই ধরনের অবজেক্টগুলোকে JSON-এ রূপান্তর করার জন্য Jackson কিছু নির্দিষ্ট অ্যানোটেশন এবং কৌশল সরবরাহ করে।
Complex Object Serialization এবং Deserialization এর জন্য Jackson এর ব্যবহার
1. Nested Objects
Nested objects বলতে বোঝানো হয়, যখন একটি Object অন্য একটি Object কে অন্তর্ভুক্ত করে। Jackson এটি স্বয়ংক্রিয়ভাবে handle করে, তবে আপনি যদি কিছু কাস্টমাইজেশন চান, তখন @JsonProperty বা @JsonManagedReference / @JsonBackReference ব্যবহার করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
private int id;
private String name;
@JsonProperty("user_details")
private UserDetails details;
// Getters and Setters
}
class UserDetails {
private String address;
private String phone;
// Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class NestedObjectSerialization {
public static void main(String[] args) throws Exception {
User user = new User();
user.setId(1);
user.setName("Rahim");
UserDetails details = new UserDetails();
details.setAddress("Dhaka");
details.setPhone("1234567890");
user.setDetails(details);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
JSON Output:
{
"id": 1,
"name": "Rahim",
"user_details": {
"address": "Dhaka",
"phone": "1234567890"
}
}
2. Collection Serialization (List, Set, Map)
Jackson List, Set, এবং Map সহ অন্যান্য Collection Types-এর Serialization এবং Deserialization সমর্থন করে।
উদাহরণ: List ব্যবহার
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
public class User {
private int id;
private String name;
@JsonProperty("user_hobbies")
private List<String> hobbies;
// Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
public class CollectionSerialization {
public static void main(String[] args) throws Exception {
User user = new User();
user.setId(1);
user.setName("Rahim");
user.setHobbies(Arrays.asList("Reading", "Gaming", "Traveling"));
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println(json);
}
}
JSON Output:
{
"id": 1,
"name": "Rahim",
"user_hobbies": ["Reading", "Gaming", "Traveling"]
}
3. Inheritance (Parent-Child Relationship)
Jackson Polymorphic Serialization সমর্থন করে, যা আপনাকে Parent-Child রিলেশনশিপের মধ্যে Object Serialization এবং Deserialization করতে দেয়। @JsonTypeInfo এবং @JsonSubTypes এর মাধ্যমে আপনি Polymorphism কনফিগার করতে পারেন।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Car.class, name = "car"),
@JsonSubTypes.Type(value = Truck.class, name = "truck")
})
abstract class Vehicle {
private String brand;
// Getter and Setter
}
class Car extends Vehicle {
private int seatingCapacity;
// Getter and Setter
}
class Truck extends Vehicle {
private int loadCapacity;
// Getter and Setter
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class InheritanceSerialization {
public static void main(String[] args) throws Exception {
Vehicle car = new Car();
((Car) car).setSeatingCapacity(5);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(car);
System.out.println(json);
}
}
JSON Output:
{
"type": "car",
"brand": "Toyota",
"seatingCapacity": 5
}
4. Circular Reference Handling (Parent-Child Relationship)
Circular Reference সমস্যা সমাধানে Jackson @JsonManagedReference এবং @JsonBackReference ব্যবহার করতে সাহায্য করে। এর মাধ্যমে Parent-Child রিলেশনশিপ সঠিকভাবে JSON-এ serialize করা যায় এবং Infinite Loop এড়ানো যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
public class Parent {
private String name;
@JsonManagedReference
private Child child;
// Getters and Setters
}
public class Child {
private String name;
@JsonBackReference
private Parent parent;
// Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CircularReferenceSerialization {
public static void main(String[] args) throws Exception {
Parent parent = new Parent();
parent.setName("Rahim");
Child child = new Child();
child.setName("Rita");
parent.setChild(child);
child.setParent(parent);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(parent);
System.out.println(json);
}
}
JSON Output:
{
"name": "Rahim",
"child": {
"name": "Rita"
}
}
Jackson Annotations ব্যবহার করে Complex Object Serialization এবং Deserialization
Jackson অ্যানোটেশনগুলি Complex Objects কে সহজেই JSON ফরম্যাটে রূপান্তর করতে সাহায্য করে। নিচে কিছু গুরুত্বপূর্ণ অ্যানোটেশনের ব্যবহার দেখানো হয়েছে:
@JsonProperty: JSON ফিল্ডের নাম পরিবর্তন।@JsonManagedReferenceএবং@JsonBackReference: Circular Reference সমাধান।@JsonTypeInfoএবং@JsonSubTypes: Polymorphic Serialization।@JsonFormat: Date/Time ফরম্যাট কাস্টমাইজ করা।@JsonCreator: Constructor-based Deserialization।@JsonIgnore: JSON Serialization/Deserialization থেকে কিছু ফিল্ড বাদ দেওয়া।
- Jackson-এর Complex Object Serialization এবং Deserialization শক্তিশালী এবং নমনীয়।
@JsonTypeInfo,@JsonManagedReference,@JsonSubTypes, এবং অন্যান্য অ্যানোটেশন ব্যবহার করে আপনি JSON ফিল্ড নিয়ন্ত্রণ এবং Complex Objects এর মধ্যে সম্পর্ক ম্যানেজ করতে পারেন।- এই অ্যানোটেশনগুলির মাধ্যমে Polymorphism, Circular References, এবং Nested Object-গুলির JSON Representation সঠিকভাবে হ্যান্ডেল করা যায়।
Read more