Jackson আপনাকে কাস্টম Annotations তৈরি করার এবং তার মাধ্যমে Serialization এবং Deserialization কাস্টমাইজ করার সুযোগ দেয়। Jackson এর ডিফল্ট অ্যানোটেশনগুলো যেমন @JsonProperty, @JsonIgnore ইত্যাদি দিয়ে অনেক কাজ করা যায়, তবে যখন আপনার বিশেষ লজিক বা প্রয়োজনে কাস্টম অ্যানোটেশন তৈরি করতে হয়, তখন আপনাকে @JsonSerialize এবং @JsonDeserialize অ্যানোটেশনগুলো ব্যবহার করতে হবে।
এছাড়া, আপনি নিজের কাস্টম অ্যানোটেশনও তৈরি করতে পারেন যেগুলো নির্দিষ্ট Serializer বা Deserializer প্রয়োগ করবে।
Custom Annotation তৈরি করার প্রক্রিয়া
Jackson-এ Custom Annotation তৈরি করার জন্য আপনাকে কয়েকটি পদক্ষেপ অনুসরণ করতে হবে:
- Custom Annotation তৈরি করুন।
- Custom Serializer বা Deserializer তৈরি করুন।
- Custom Serializer বা Deserializer কে
@JsonSerializeবা@JsonDeserializeঅ্যানোটেশন দিয়ে প্রয়োগ করুন।
প্র্যাকটিক্যাল উদাহরণ: Custom Date Formatter
আমরা একটি কাস্টম অ্যানোটেশন তৈরি করব যা Date টাইপের ফিল্ডের জন্য একটি কাস্টম ফরম্যাট প্রয়োগ করবে।
Step 1: Custom Annotation তৈরি করুন
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@JacksonAnnotationsInside
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@JsonSerialize(using = CustomDateSerializer.class) // Serializer প্রয়োগ
public @interface CustomDateFormat {
String pattern() default "yyyy-MM-dd"; // Default pattern
}
এখানে আমরা @CustomDateFormat অ্যানোটেশন তৈরি করেছি, যা CustomDateSerializer এর মাধ্যমে Date ফিল্ডের জন্য কাস্টম ফরম্যাট প্রয়োগ করবে।
Step 2: Custom Serializer তৈরি করুন
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDateSerializer extends JsonSerializer<Date> {
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
String formattedDate = formatter.format(value);
gen.writeString(formattedDate); // JSON আউটপুটে কাস্টম ফরম্যাটে তারিখ লেখার জন্য
}
}
এই CustomDateSerializer কাস্টম Date ফরম্যাট তৈরি করবে এবং JSON আউটপুটে সেই ফরম্যাটে তারিখ সিরিয়ালাইজ করবে।
Step 3: Custom Annotation প্রয়োগ করুন
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
Employee employee = new Employee("Rahim", new Date());
// ObjectMapper তৈরি
ObjectMapper mapper = new ObjectMapper();
// Employee অবজেক্ট JSON এ সিরিয়ালাইজ করা
String json = mapper.writeValueAsString(employee);
// JSON আউটপুট
System.out.println(json);
}
}
class Employee {
private String name;
@CustomDateFormat(pattern = "yyyy-MM-dd") // Custom Annotation প্রয়োগ
private Date hireDate;
public Employee(String name, Date hireDate) {
this.name = name;
this.hireDate = hireDate;
}
// Getters and Setters
}
এখানে @CustomDateFormat অ্যানোটেশন দিয়ে hireDate ফিল্ডে কাস্টম তারিখ ফরম্যাট প্রয়োগ করা হয়েছে।
Output:
{
"name": "Rahim",
"hireDate": "2024-12-21"
}
এখানে hireDate ফিল্ডটি কাস্টম তারিখ ফরম্যাট yyyy-MM-dd অনুযায়ী সিরিয়ালাইজ হয়েছে।
আরেকটি উদাহরণ: Custom Deserializer
Jackson-এ Custom Deserializer ব্যবহার করার জন্য একইভাবে @JsonDeserialize অ্যানোটেশন ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হল যেখানে আমরা একটি String টাইপ ফিল্ডের জন্য কাস্টম Deserializer ব্যবহার করব।
Step 1: Custom Deserializer তৈরি করুন
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class CustomStringDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getText().toUpperCase(); // String value কে uppercase করতে
return value;
}
}
এখানে CustomStringDeserializer একটি String ফিল্ডের জন্য JSON ডেটাকে uppercase করে ডেসিরিয়ালাইজ করবে।
Step 2: @JsonDeserialize ব্যবহার করুন
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"rahim\"}";
// ObjectMapper তৈরি
ObjectMapper mapper = new ObjectMapper();
// JSON থেকে Employee অবজেক্ট তৈরি
Employee employee = mapper.readValue(json, Employee.class);
// Employee নাম uppercase হয়ে এসেছে
System.out.println("Name: " + employee.getName());
}
}
class Employee {
@JsonDeserialize(using = CustomStringDeserializer.class) // Custom Deserializer প্রয়োগ
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Output:
Name: RAHIM
এখানে name ফিল্ডের জন্য কাস্টম ডেসিরিয়ালাইজার CustomStringDeserializer ব্যবহৃত হয়েছে, যা JSON ডেটার name ফিল্ডটিকে uppercase করে ডেসিরিয়ালাইজ করেছে।
- Custom Annotations তৈরি করে Jackson-এ ডেটা কাস্টমাইজ করা যায়।
@JsonSerializeএবং@JsonDeserializeঅ্যানোটেশন ব্যবহার করে কাস্টম Serializer এবং Deserializer তৈরি করা যায়।- Dynamic Filtering এবং Custom Processing এর জন্য কাস্টম অ্যানোটেশন খুবই উপকারী, যেখানে আপনি ফিল্ডের কাস্টম ফরম্যাট বা ডেটার প্রক্রিয়া পরিবর্তন করতে পারেন।
Jackson এ Custom Annotations ব্যবহার করে আপনার JSON প্রক্রিয়াকরণ আরো নমনীয় এবং কার্যকর করতে পারেন।
Read more