জ্যাকসন (Jackson) লাইব্রেরি ব্যবহার করে জাভাতে কমপ্লেক্স অবজেক্টের Serialization এবং Deserialization অত্যন্ত সহজ এবং কার্যকর। এটি JSON (JavaScript Object Notation) ডেটা ফরম্যাট নিয়ে কাজ করার জন্য ব্যবহৃত হয়। জ্যাকসনের মাধ্যমে আমরা জাভার কমপ্লেক্স অবজেক্টগুলোকে JSON-এ রূপান্তর করতে এবং JSON থেকে জাভা অবজেক্ট পুনরুদ্ধার করতে পারি।
1. জ্যাকসনের প্রাথমিক ধারণা
- Serialization: জাভা অবজেক্টকে JSON স্ট্রিং-এ রূপান্তর করা।
- Deserialization: JSON স্ট্রিং-কে জাভা অবজেক্টে রূপান্তর করা।
জ্যাকসন লাইব্রেরির প্রধান তিনটি গুরুত্বপূর্ণ ক্লাস:
ObjectMapper: Serialization এবং Deserialization-এর মূল কাজ করে।JsonNode: Tree Model-এ JSON ডেটা রিপ্রেজেন্ট করতে ব্যবহৃত হয়।- Annotations: জ্যাকসনের অ্যানোটেশন ব্যবহার করে JSON mapping কাস্টমাইজ করা যায়।
2. Complex Object Serialization and Deserialization
কমপ্লেক্স অবজেক্ট বলতে বোঝায় যে অবজেক্টের মধ্যে আরেকটি অবজেক্ট বা Collection রয়েছে। নিচে উদাহরণসহ বিষয়টি ব্যাখ্যা করা হলো।
উদাহরণ: Complex Object Serialization এবং Deserialization
মডেল ক্লাস তৈরি
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
class Address {
private String street;
private String city;
// Constructors, Getters, and Setters
public Address() {}
public Address(String street, String city) {
this.street = street;
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"street='" + street + '\'' +
", city='" + city + '\'' +
'}';
}
}
class Employee {
private String name;
private int age;
private List<Address> addresses;
// Constructors, Getters, and Setters
public Employee() {}
public Employee(String name, int age, List<Address> addresses) {
this.name = name;
this.age = age;
this.addresses = addresses;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", age=" + age +
", addresses=" + addresses +
'}';
}
}
Serialization (Object to JSON)
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
public class JacksonSerializationExample {
public static void main(String[] args) {
// Complex Object তৈরি
Address address1 = new Address("123 Main St", "Dhaka");
Address address2 = new Address("456 Park Ave", "Chittagong");
Employee employee = new Employee("John Doe", 30, Arrays.asList(address1, address2));
try {
// ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Object থেকে JSON String
String jsonString = mapper.writeValueAsString(employee);
System.out.println("Serialized JSON:\n" + jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
{
"name": "John Doe",
"age": 30,
"addresses": [
{
"street": "123 Main St",
"city": "Dhaka"
},
{
"street": "456 Park Ave",
"city": "Chittagong"
}
]
}
Deserialization (JSON to Object)
public class JacksonDeserializationExample {
public static void main(String[] args) {
String jsonString = """
{
"name": "John Doe",
"age": 30,
"addresses": [
{"street": "123 Main St", "city": "Dhaka"},
{"street": "456 Park Ave", "city": "Chittagong"}
]
}
""";
try {
// ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// JSON থেকে Object
Employee employee = mapper.readValue(jsonString, Employee.class);
System.out.println("Deserialized Object:\n" + employee);
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Deserialized Object:
Employee{name='John Doe', age=30, addresses=[Address{street='123 Main St', city='Dhaka'}, Address{street='456 Park Ave', city='Chittagong'}]}
3. Jackson Annotations
অ্যানোটেশন ব্যবহার করে JSON এবং Object-এর মধ্যকার ম্যাপিং কাস্টমাইজ করা যায়। গুরুত্বপূর্ণ কয়েকটি অ্যানোটেশন:
@JsonProperty: JSON ফিল্ড এবং জাভা ফিল্ডের নাম আলাদা হলে ব্যবহৃত হয়।@JsonIgnore: কোনো ফিল্ডকে JSON serialization/deserialization থেকে বাদ দিতে ব্যবহৃত হয়।@JsonInclude: নির্দিষ্ট শর্তে ফিল্ডগুলো JSON-এ যোগ করতে ব্যবহৃত হয়।
উদাহরণ: @JsonProperty ব্যবহার
class Address {
@JsonProperty("street_name")
private String street;
@JsonProperty("city_name")
private String city;
// Constructor, Getters, and Setters
}
4. সুবিধা ও পরামর্শ
- সহজ ব্যবহার: জ্যাকসনের মাধ্যমে কমপ্লেক্স অবজেক্ট নিয়ে কাজ করা খুবই সহজ।
- স্পষ্টতা: কোড কাস্টমাইজ করা যায়, যা JSON এবং জাভার মধ্যে স্পষ্ট সম্পর্ক তৈরি করে।
- পারফরম্যান্স: দ্রুত Serialization এবং Deserialization-এর জন্য জ্যাকসন অত্যন্ত কার্যকর।
Read more