Jackson লাইব্রেরি আপনাকে JSON Serialization এবং Deserialization কাস্টমাইজ করার জন্য Custom Annotations তৈরি করার সুযোগ দেয়। আপনি যদি নিজের প্রয়োজন অনুযায়ী ফিল্ড বা ক্লাসের কাস্টম Serialization বা Deserialization আচরণ তৈরি করতে চান, তবে Custom Annotations তৈরি করে Jackson এর মধ্যে তা সংযুক্ত করা যেতে পারে।
Custom Annotation তৈরি করার জন্য পদক্ষেপ
- Custom Annotation তৈরি করুন: প্রথমে একটি কাস্টম অ্যানোটেশন তৈরি করুন যা আপনি Jackson এর Serialization বা Deserialization কাস্টমাইজ করতে ব্যবহার করবেন।
- Custom Serializer বা Deserializer তৈরি করুন: কাস্টম অ্যানোটেশন ব্যবহার করার জন্য একটি কাস্টম Serializer বা Deserializer তৈরি করতে হবে যা এই অ্যানোটেশনকে প্রক্রিয়া করবে।
- Jackson এর ObjectMapper-এ Custom Serializer বা Deserializer যুক্ত করুন: Jackson ObjectMapper ব্যবহার করে আপনার Custom Serializer বা Deserializer যুক্ত করুন।
Custom Annotation তৈরি করার উদাহরণ
Step 1: Custom Annotation তৈরি করা
ধরা যাক আমরা একটি @UpperCase নামক Custom Annotation তৈরি করতে চাই যা JSON Serialization-এর সময় ফিল্ডের মানকে বড় হাতের অক্ষরে রূপান্তর করবে।
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UpperCase {
// Custom annotation to mark fields that should be converted to uppercase
}
এটি একটি @UpperCase অ্যানোটেশন, যা শুধুমাত্র ফিল্ডে প্রয়োগ করা যাবে এবং এটি রUNTIME এ অ্যাক্সেসযোগ্য হবে।
Step 2: Custom Serializer তৈরি করা
এখন, আমাদের একটি কাস্টম Serializer তৈরি করতে হবে যা @UpperCase অ্যানোটেশনের ফিল্ডগুলোকে বড় হাতের অক্ষরে রূপান্তর করবে।
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.lang.reflect.Field;
public class UpperCaseSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// Serialize the object to JSON
gen.writeStartObject();
// Get all fields of the object
Field[] fields = value.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
// Check if the field has the @UpperCase annotation
if (field.isAnnotationPresent(UpperCase.class)) {
try {
// Convert the field value to uppercase
String fieldValue = (String) field.get(value);
gen.writeStringField(field.getName(), fieldValue != null ? fieldValue.toUpperCase() : null);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
// Write the field as it is
try {
gen.writeObjectField(field.getName(), field.get(value));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
gen.writeEndObject();
}
}
এই কাস্টম Serializer ক্লাসটি @UpperCase অ্যানোটেশনের ফিল্ডগুলোকে বড় হাতের অক্ষরে রূপান্তর করবে।
Step 3: Custom Serializer ব্যবহার করা
এখন, Jackson ObjectMapper ব্যবহার করে কাস্টম Serializer নিবন্ধন করা হবে এবং @UpperCase অ্যানোটেশন প্রক্রিয়া করা হবে।
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
// Create an instance of the object
User user = new User("john doe", 25);
// Create an ObjectMapper instance
ObjectMapper objectMapper = new ObjectMapper();
// Register the custom serializer for @UpperCase annotation
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new UpperCaseSerializer());
objectMapper.registerModule(module);
// Serialize the object to JSON
String json = objectMapper.writeValueAsString(user);
// Print the result
System.out.println(json);
}
}
class User {
@UpperCase
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
JSON Output:
{
"name": "JOHN DOE",
"age": 25
}
এখানে name ফিল্ডটি @UpperCase অ্যানোটেশন থাকার কারণে বড় হাতের অক্ষরে পরিণত হয়েছে।
Custom Deserializer তৈরি করা
Custom Deserializer তৈরি করার জন্য আপনি JsonDeserializer ইন্টারফেস ইমপ্লিমেন্ট করবেন এবং deserialize() মেথডে কাস্টম ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করবেন।
Example: Custom Deserializer
ধরা যাক, আমরা একটি Person ক্লাসের name ফিল্ডকে lowercase এ ডেসিরিয়ালাইজ করতে চাই।
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 LowerCaseDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getText();
return value != null ? value.toLowerCase() : null; // Convert to lowercase
}
}
Step 2: Custom Deserializer ব্যবহার করা
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Person {
@JsonDeserialize(using = LowerCaseDeserializer.class)
private String name;
private int age;
// Constructors, Getters, and Setters
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Step 3: Custom Deserializer দিয়ে JSON থেকে Object তৈরি করা
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"JOHN DOE\", \"age\":30}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
System.out.println("Name: " + person.getName()); // name should be converted to lowercase
System.out.println("Age: " + person.getAge());
}
}
Output:
Name: john doe
Age: 30
এখানে name ফিল্ডটি @JsonDeserialize অ্যানোটেশন ব্যবহার করে কাস্টম LowerCaseDeserializer দিয়ে lowercase এ ডেসিরিয়ালাইজ করা হয়েছে।
- Custom Serializer এবং Custom Deserializer Jackson-এ JSON Serialization এবং Deserialization কাস্টমাইজ করার জন্য শক্তিশালী টুল।
- Custom Annotations তৈরি করে Jackson এর Behavior কাস্টমাইজ করা যায়, যেমন field values পরিবর্তন করা, custom formats প্রয়োগ করা, এবং specific deserialization logic তৈরি করা।
- Jackson আপনাকে
JsonSerializer<T>এবংJsonDeserializer<T>ইন্টারফেস ব্যবহার করে কাস্টম লজিক প্রয়োগের মাধ্যমে আরও নিয়ন্ত্রণ এবং নমনীয়তা দেয়।
Jackson একটি শক্তিশালী এবং নমনীয় JSON প্রসেসিং লাইব্রেরি, যা Java অবজেক্টগুলিকে JSON-এ রূপান্তর (Serialization) এবং JSON থেকে Java অবজেক্টে রূপান্তর (Deserialization) করতে ব্যবহৃত হয়। Jackson সরাসরি বেশ কিছু বিল্ট-ইন অ্যানোটেশন যেমন @JsonProperty, @JsonIgnore, @JsonFormat ইত্যাদি প্রদান করে, কিন্তু কখনও কখনও ডেভেলপারদের আরও কাস্টম লজিক বা কার্যকারিতা প্রয়োগ করার জন্য Custom Jackson Annotations তৈরি করতে হয়।
Custom Jackson Annotations ব্যবহার করে আপনি নিজের প্রয়োজন অনুযায়ী JSON ফরম্যাটিং, ক্ষেত্রগুলো সিলেক্টিভভাবে সিরিয়ালাইজ বা ডেসিরিয়ালাইজ এবং অন্যান্য কাস্টম লজিক প্রয়োগ করতে পারেন।
Custom Jackson Annotations তৈরি করা কেন প্রয়োজন?
- Specific Formatting or Serialization Rules:
- আপনি যদি JSON ফরম্যাটের জন্য নির্দিষ্ট নিয়ম তৈরি করতে চান যা Jackson এর ডিফল্ট অ্যানোটেশন দ্বারা সমর্থিত নয়, তখন কাস্টম অ্যানোটেশন তৈরি করতে হতে পারে।
- Field-Level Customization:
- কখনও কখনও আপনাকে কিছু private বা protected ফিল্ড JSON-এ সিরিয়ালাইজ করতে বা ডেসিরিয়ালাইজ করতে হতে পারে, যা default visibility rules দ্বারা সাপোর্টেড নয়।
- Complex Data Structures:
- JSON অবজেক্টের মধ্যে অনেক জটিল বা নেস্টেড ডেটা স্ট্রাকচার থাকতে পারে, যা Jackson-এ ম্যানুয়ালি প্রক্রিয়া করার জন্য কাস্টম অ্যানোটেশন প্রয়োজন।
- Better Control Over Serialization/Deserialization:
- কখনও কখনও Jackson এর ডিফল্ট Serialization এবং Deserialization প্রক্রিয়া আপনার চাহিদা মেটায় না। কাস্টম অ্যানোটেশন দ্বারা আপনি এগুলোর আচরণ নিয়ন্ত্রণ করতে পারেন।
- Cross-cutting Concerns:
- কাস্টম অ্যানোটেশন দিয়ে আপনি কিছু সাধারণ কার্যকলাপ করতে পারেন যা বিভিন্ন জায়গায় প্রয়োগ করা হবে (যেমন, ফিল্ড ভ্যালিডেশন, স্পেশাল লজিক প্রযোজ্য করা)।
Custom Jackson Annotations তৈরি করার প্রক্রিয়া
Jackson এর মাধ্যমে Custom Annotations তৈরি করার জন্য আপনাকে Annotation এবং JsonSerializer/ JsonDeserializer ক্লাসের সমন্বয় করতে হবে। নিচে একটি বিস্তারিত উদাহরণ দেখানো হয়েছে।
Custom Jackson Annotation উদাহরণ:
Step 1: Custom Annotation তৈরি করা
ধরা যাক, আমরা একটি কাস্টম অ্যানোটেশন তৈরি করতে চাই, যা একটি নির্দিষ্ট প্রোপার্টি JSON ফিল্ড হিসেবে uppercase (uppercase case) এ সিরিয়ালাইজ করবে।
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD) // Applies to fields only
@Retention(RetentionPolicy.RUNTIME)
public @interface Uppercase {
// Custom annotation to convert the value to uppercase
}
এখানে, @Uppercase অ্যানোটেশনটি ফিল্ডগুলোর উপর প্রয়োগ করা হবে এবং শুধুমাত্র runtime এ অ্যাক্সেসযোগ্য হবে।
Step 2: Custom Serializer তৈরি করা
এখন আমাদের একটি custom serializer তৈরি করতে হবে, যা Uppercase অ্যানোটেশনটি দেখে ফিল্ডের মান uppercase-এ পরিবর্তন করবে।
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.lang.reflect.Field;
public class UppercaseSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
// Check if the field has the Uppercase annotation
Field field = value.getClass().getDeclaredField(gen.getCurrentName());
if (field.isAnnotationPresent(Uppercase.class)) {
// Convert the value to uppercase if the Uppercase annotation is present
String uppercaseValue = value.toString().toUpperCase();
gen.writeString(uppercaseValue);
} else {
// Otherwise, write the value normally
gen.writeObject(value);
}
} catch (NoSuchFieldException e) {
gen.writeObject(value); // Default handling if field not found
}
}
}
Step 3: Custom Annotation ব্যবহার করা
এখন আমরা আমাদের Uppercase অ্যানোটেশনটি ব্যবহার করে একটি ক্লাস তৈরি করবো এবং ওই ফিল্ডগুলো সিরিয়ালাইজ করার সময় কাস্টম লজিক প্রয়োগ করবো।
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class Person {
@Uppercase // Apply the custom annotation to the name field
@JsonSerialize(using = UppercaseSerializer.class)
private String name;
private int age;
// Constructors, Getters, and Setters
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
Step 4: Object Serialization Example
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
Person person = new Person("John Doe", 30);
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);
// Output the serialized JSON
System.out.println(jsonString);
}
}
Output:
{
"name": "JOHN DOE",
"age": 30
}
এখানে, name ফিল্ডটি uppercase-এ রূপান্তরিত হয়েছে কারণ আমরা @Uppercase অ্যানোটেশন এবং UppercaseSerializer ব্যবহার করেছি।
Custom Jackson Annotation এর সুবিধা
- Custom Validation:
- আপনি কাস্টম অ্যানোটেশন ব্যবহার করে ফিল্ডের জন্য কাস্টম ভ্যালিডেশন তৈরি করতে পারেন, যেমন ডেটার ফরম্যাট চেক করা বা কাস্টম কন্ডিশন চেক করা।
- Cross-cutting Concerns:
- আপনি অ্যাপ্লিকেশন জুড়ে একই ধরনের কার্যকলাপ করতে কাস্টম অ্যানোটেশন তৈরি করতে পারেন (যেমন, security tokens প্রয়োগ করা, logging বা formatting সমন্বয় করা)।
- Code Reusability:
- কাস্টম অ্যানোটেশন তৈরি করার মাধ্যমে আপনি একাধিক ক্লাস বা ফিল্ডে পুনরায় একই কার্যকলাপ ব্যবহার করতে পারেন, যার ফলে কোডটি আরও পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য হয়।
- Serialization Control:
- Jackson এ কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার তৈরি করে আপনি কীভাবে অবজেক্ট JSON-এ পরিণত হবে বা JSON থেকে অবজেক্টে রূপান্তরিত হবে তা সম্পূর্ণ নিয়ন্ত্রণ করতে পারেন।
- Custom Jackson Annotations Jackson-এর শক্তিশালী ফিচার যা আপনাকে JSON প্রক্রিয়াকরণে গভীর নিয়ন্ত্রণ প্রদান করে।
- Annotations তৈরি করার মাধ্যমে আপনি কাস্টম Serialization এবং Deserialization লজিক প্রয়োগ করতে পারেন, যা validation, formatting, data conversion, এবং serialization rules এর জন্য উপকারী।
- Jackson অ্যানোটেশন ব্যবহার করে আপনার কোডকে আরও কার্যকরী, পুনরাবৃত্তিযোগ্য এবং পরিষ্কার করতে পারবেন।
Jackson ব্যবহার করে JSON Serialization এবং Deserialization-এর জন্য আপনি Custom Annotations তৈরি করতে পারেন, যা JSON প্রক্রিয়াকরণকে আরও কাস্টমাইজড ও নিয়ন্ত্রিত করতে সহায়তা করে। Jackson এর custom annotations ব্যবহার করে আপনি নিজের প্রয়োজনীয় ফিল্ড ম্যানিপুলেশন, কাস্টম Serialization/Deserialization বা প্রক্রিয়া নিয়ন্ত্রণ করতে পারেন।
এই লেখায় আমরা Custom Annotations তৈরি এবং Configurer করার প্রক্রিয়া আলোচনা করব, যা Jackson JSON প্রক্রিয়াকরণের জন্য বিশেষভাবে তৈরি হবে।
Custom Annotations তৈরি এবং Jackson এ Configurer করা
Jackson এ Custom Annotations তৈরি করার জন্য সাধারণত আপনাকে একটি custom annotation তৈরি করতে হবে এবং তারপর ObjectMapper এর মাধ্যমে সেটি কনফিগার করতে হবে।
ধাপ ১: Custom Annotation তৈরি করা
Jackson এর @JsonSerialize, @JsonDeserialize এর মতো অ্যানোটেশন এর মতোই, আপনি আপনার প্রয়োজন অনুযায়ী একটি Custom Annotation তৈরি করতে পারেন।
Java Class Example:
import com.fasterxml.jackson.annotation.JacksonAnnotation;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface CustomJsonFormat {
String value() default "default format";
}
এখানে, @CustomJsonFormat একটি কাস্টম অ্যানোটেশন যা একটি value ফিল্ড ধারণ করে। এই অ্যানোটেশনটি Jackson প্রক্রিয়ার জন্য তৈরি করা হয়েছে, তবে আমরা এটিকে কাস্টম ফিল্ড ফরম্যাটিং বা প্রক্রিয়া করতে ব্যবহার করতে পারব।
ধাপ ২: Custom Serializer তৈরি করা
Jackson-এ custom annotations প্রয়োগ করার জন্য, আপনাকে Custom Serializer তৈরি করতে হবে। এটি নির্দিষ্ট ফিল্ড বা ক্লাসের জন্য কাস্টম Serialization প্রক্রিয়া প্রয়োগ করবে।
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
public class CustomJsonFormatSerializer extends StdSerializer<Object> {
public CustomJsonFormatSerializer() {
this(null);
}
public CustomJsonFormatSerializer(Class<Object> t) {
super(t);
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
// Custom JSON Formatting logic
if (value instanceof String) {
String formattedValue = ((String) value).toUpperCase(); // Example custom logic
gen.writeString(formattedValue);
} else {
gen.writeObject(value);
}
}
}
এখানে, CustomJsonFormatSerializer একটি custom serializer তৈরি করেছে যা স্ট্রিং টাইপের ভ্যালুকে uppercase-এ রূপান্তর করবে।
ধাপ ৩: Custom Annotation প্রয়োগ করা
এখন, আপনার @CustomJsonFormat অ্যানোটেশনটি Jackson Serializer এর সাথে যুক্ত করতে হবে।
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class User {
private int id;
@JsonSerialize(using = CustomJsonFormatSerializer.class)
private String name;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
এখানে, @JsonSerialize(using = CustomJsonFormatSerializer.class) ব্যবহার করে আমরা name ফিল্ডের জন্য CustomJsonFormatSerializer Serializer অ্যাপ্লাই করেছি, যাতে এটি JSON এ serialization হওয়ার সময় custom ফরম্যাটিং করবে।
ধাপ ৪: ObjectMapper Configurer
Jackson-এর ObjectMapper-এ Custom Annotation এবং Custom Serializer কনফিগার করতে হবে যাতে Jackson অ্যানোটেশনটি সঠিকভাবে কাজ করে।
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
// Create User object
User user = new User();
user.setId(1);
user.setName("rahim");
// Configure ObjectMapper
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
// Print formatted JSON
System.out.println(json); // Output: {"id":1,"name":"RAHIM"}
}
}
Output:
{
"id": 1,
"name": "RAHIM"
}
এখানে, name ফিল্ডটি uppercase হয়ে সেরিয়ালাইজ হয়েছে কারণ আমাদের CustomJsonFormatSerializer সেটি প্রক্রিয়া করেছে।
Jackson Configurer এবং Custom Annotations এর ব্যবহার
- Custom Serializer:
@JsonSerialize(using = CustomSerializer.class)ব্যবহার করে আপনি Jackson এর মাধ্যমে যে কোন ফিল্ডের জন্য কাস্টম ফরম্যাট প্রয়োগ করতে পারেন। - Custom Deserializer:
@JsonDeserialize(using = CustomDeserializer.class)ব্যবহার করে আপনি JSON থেকে Java Object-এ কাস্টম মাপ প্রয়োগ করতে পারেন। - Dynamic Behavior: Custom annotations দিয়ে ডাইনামিক JSON ফিল্ড প্রসেসিং এবং নিয়ন্ত্রণ করা যায়।
- Consistency: JSON ফরম্যাটের সাথে Java Object এর consistency বজায় রাখতে কাস্টম অ্যানোটেশন ব্যবহার করা যায়।
- Custom Annotations Jackson-এ JSON প্রক্রিয়াকরণকে আরও কাস্টমাইজড করতে সহায়তা করে।
- Custom Serializer এবং Custom Deserializer তৈরি করে আপনি JSON ফিল্ডের নির্দিষ্ট আচরণ নিয়ন্ত্রণ করতে পারেন।
- Jackson ObjectMapper এর মাধ্যমে custom annotation এবং custom logic প্রয়োগ করে JSON প্রক্রিয়া আরও গতিশীল এবং নিয়ন্ত্রিত করা সম্ভব।
Jackson এর Custom Annotations ব্যবহার করে আপনি JSON Serialization এবং Deserialization এর জন্য আরো কাস্টমাইজড ও অ্যাডভান্সড ম্যাপিং কনফিগারেশন করতে পারেন। এই প্রক্রিয়া নির্দিষ্ট ফিল্ডগুলোর জন্য কাস্টম Serialization, Deserialization, বা Filtering সুবিধা প্রদান করে। Jackson এর বিল্ট-ইন অ্যানোটেশনগুলির বাইরে, আপনি নিজের অ্যানোটেশন তৈরি করে ফিল্ড বা ক্লাসগুলির জন্য কাস্টম লজিক প্রয়োগ করতে পারেন।
Custom Annotation তৈরি করে Advanced Mapping কনফিগার করা
Jackson ব্যবহারকারীরা যখন বিভিন্ন ফিল্ডের জন্য কাস্টম লজিক প্রয়োগ করতে চান, তখন Custom Annotation তৈরি করতে পারেন এবং এর সাহায্যে JSON এর কাঠামো কাস্টমাইজ করা যায়।
ধাপ ১: Custom Annotation তৈরি করা
প্রথমে, আপনাকে একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে যেটি Jackson-এ ম্যাপিং কনফিগার করতে ব্যবহৃত হবে। উদাহরণস্বরূপ, আমরা একটি কাস্টম অ্যানোটেশন তৈরি করব যা নির্দিষ্ট ফিল্ডের জন্য Serialization এবং Deserialization কাস্টমাইজ করবে।
কাস্টম অ্যানোটেশন উদাহরণ:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // Annotation will be available at runtime
public @interface CustomFormat {
String value() default "default_value"; // Default value for custom format
}
এখানে, আমরা একটি @CustomFormat অ্যানোটেশন তৈরি করেছি যা পরে ক্লাস বা ফিল্ডের উপর প্রয়োগ করা হবে এবং নির্দিষ্ট মান সংরক্ষণ করবে।
ধাপ ২: Custom Serializer তৈরি করা
Jackson-এ Custom Serializer তৈরি করতে হবে, যাতে আমাদের কাস্টম অ্যানোটেশন অনুসারে ফিল্ডের Serialization কাস্টমাইজ করা যায়।
Custom Serializer উদাহরণ:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
public class CustomFormatSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
gen.writeString(value.toUpperCase()); // Custom logic: Convert to uppercase
} else {
gen.writeNull();
}
}
}
এখানে, CustomFormatSerializer ক্লাসে, আমরা কাস্টম Serialization লজিক লিখেছি যেখানে String টাইপের ফিল্ডগুলি uppercase-এ রূপান্তরিত হবে।
ধাপ ৩: Custom Annotation প্রয়োগ করা
এখন আমাদের কাস্টম অ্যানোটেশন এবং Serializer তৈরি হয়ে গেছে। আমাদের মূল অবজেক্টে এই কাস্টম অ্যানোটেশন প্রয়োগ করতে হবে।
কাস্টম অ্যানোটেশন প্রয়োগ উদাহরণ:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class Person {
private String name;
@CustomFormat
@JsonSerialize(using = CustomFormatSerializer.class) // Custom Serializer Applied
private String customField;
// Constructors, Getters, Setters
public Person(String name, String customField) {
this.name = name;
this.customField = customField;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
}
এখানে, আমরা customField নামের একটি ফিল্ডে @CustomFormat এবং @JsonSerialize(using = CustomFormatSerializer.class) অ্যানোটেশন প্রয়োগ করেছি, যা ওই ফিল্ডটির কাস্টম Serialization লজিক প্রয়োগ করবে।
ধাপ ৪: ObjectMapper দিয়ে Serialization
এখন Jackson এর ObjectMapper ব্যবহার করে ফিল্ডগুলোর Serialization করতে হবে। আমাদের কাস্টম অ্যানোটেশন অনুযায়ী customField ফিল্ডটির মান uppercase হবে।
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomAnnotationExample {
public static void main(String[] args) throws Exception {
// Create an object with custom field data
Person person = new Person("John Doe", "hello world");
// Create ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Serialize the object to JSON
String json = mapper.writeValueAsString(person);
System.out.println(json);
}
}
JSON Output:
{
"name": "John Doe",
"customField": "HELLO WORLD"
}
এখানে, customField ফিল্ডটির মান "hello world" ছিল, যা আমাদের কাস্টম Serializer এর মাধ্যমে "HELLO WORLD" হয়ে গেছে।
ধাপ ৫: Custom Deserializer তৈরি করা
এখন আমরা Custom Deserializer তৈরি করব, যাতে JSON থেকে ডেটা Deserialization করার সময় কাস্টম লজিক প্রয়োগ করা যায়।
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 CustomFormatDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getText();
if (value != null) {
return value.toLowerCase(); // Custom logic: Convert to lowercase
}
return null;
}
}
এখানে, CustomFormatDeserializer ক্লাসে, আমরা কাস্টম Deserialization লজিক লিখেছি, যেখানে JSON থেকে ডেটা পড়ার সময় স্ট্রিংটি lowercase হয়ে যাবে।
ধাপ ৬: Custom Deserializer প্রয়োগ করা
এখন, কাস্টম Deserializer প্রয়োগ করতে হবে:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Person {
private String name;
@CustomFormat
@JsonDeserialize(using = CustomFormatDeserializer.class) // Custom Deserializer Applied
private String customField;
// Constructors, Getters, Setters
public Person(String name, String customField) {
this.name = name;
this.customField = customField;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
}
Deserialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomDeserializerExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"John Doe\", \"customField\":\"HELLO WORLD\"}";
// Create ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Deserialize the JSON string into a Person object
Person person = mapper.readValue(json, Person.class);
// Print the deserialized object
System.out.println("Name: " + person.getName());
System.out.println("Custom Field: " + person.getCustomField());
}
}
Output:
Name: John Doe
Custom Field: hello world
এখানে, customField JSON থেকে "HELLO WORLD" ডেসিরিয়ালাইজ হয়ে "hello world" হয়ে গেছে, কারণ আমাদের কাস্টম Deserializer lowercase কনভার্সন করেছে
- Custom Annotations ব্যবহার করে Jackson এর Serialization এবং Deserialization কাস্টমাইজ করা যায়।
@JsonSerializeএবং@JsonDeserializeএর মাধ্যমে কাস্টম লজিক প্রয়োগ করা সম্ভব। - Custom Annotation তৈরি করে আপনি বিশেষ ধরনের ফিল্ড ম্যাপিং এবং কাস্টম ফিল্টারিং, ট্রান্সফরমেশন এবং কনভার্সন লজিক অ্যাড করতে পারেন।
- Jackson এর কাস্টম অ্যানোটেশন ব্যবহারের মাধ্যমে API এবং ডেটা মডেল উন্নয়ন আরও লচ্যন এবং কাস্টমাইজড করা সম্ভব।
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