Gson-এ @JsonAdapter অ্যানোটেশনটি ব্যবহার করা হয় বিশেষ কাস্টম কনভার্সন লজিক নির্ধারণ করতে, যা Gson JSON পার্সিং এবং সিরিয়ালাইজেশনের জন্য ব্যবহার করতে পারে। এটি সাধারণত কাস্টম সেরিয়ালাইজার বা ডেসিরিয়ালাইজারের সাথে কাজ করার জন্য ব্যবহৃত হয়, যেমন কোনো ফিল্ড বা অবজেক্টের জন্য বিশেষ কাস্টম কনভার্সন রুল প্রয়োজন হলে।
কাস্টম সেরিয়ালাইজার এবং ডেসিরিয়ালাইজার
ধরা যাক, আমাদের একটি Person অবজেক্ট আছে, যেখানে জন্মতারিখ একটি Date টাইপের ফিল্ড হিসেবে থাকে। যদি আমরা সেই Date টাইপকে বিশেষ কোন ফরম্যাটে JSON এ কনভার্ট করতে চাই, তবে আমরা @JsonAdapter ব্যবহার করতে পারি।
1. DateAdapter কাস্টম সেরিয়ালাইজার এবং ডেসিরিয়ালাইজার
উদাহরণ:
import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
// কাস্টম সেরিয়ালাইজার
class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
private static final String DATE_FORMAT = "yyyy-MM-dd"; // কাস্টম ফরম্যাট
@Override
public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return new JsonPrimitive(sdf.format(date)); // কাস্টম ফরম্যাটে Date সিরিয়ালাইজ করা
}
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
try {
return sdf.parse(json.getAsString()); // JSON String থেকে Date পসা করা
} catch (Exception e) {
throw new JsonParseException("Invalid date format", e);
}
}
}
class Person {
private String name;
private Date birthDate;
// Constructor
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
// Getter methods
public String getName() {
return name;
}
public Date getBirthDate() {
return birthDate;
}
}
public class Main {
public static void main(String[] args) {
// Gson এর মধ্যে কাস্টম সেরিয়ালাইজার এবং ডেসিরিয়ালাইজার সংযুক্ত করা
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateAdapter()) // DateAdapter কাস্টম অ্যাডাপ্টার ব্যবহার
.create();
// Java Object তৈরি করা
Person person = new Person("John Doe", new Date());
// Java Object কে JSON এ কনভার্ট করা
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// JSON কে Java Object এ কনভার্ট করা
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + personFromJson.getName() + ", Birth Date: " + personFromJson.getBirthDate());
}
}
ব্যাখ্যা:
- কাস্টম সেরিয়ালাইজার (
DateAdapter):serialize()মেথড ব্যবহার করেDateঅবজেক্টকে কাস্টম ফরম্যাটে JSON এ কনভার্ট করা হয়েছে।deserialize()মেথড JSON থেকেDateঅবজেক্টে কনভার্ট করার জন্য ব্যবহৃত হয়েছে।
- GsonBuilder:
registerTypeAdapter(Date.class, new DateAdapter()): এটিDateটাইপের জন্য কাস্টমDateAdapterঅ্যাডাপ্টার ব্যবহার করে।
2. @JsonAdapter অ্যানোটেশন ব্যবহার:
Gson এর @JsonAdapter অ্যানোটেশনটি সরাসরি ক্লাসে ব্যবহার করা যেতে পারে, যেন আপনি নির্দিষ্ট কোনো ক্লাসের জন্য কাস্টম সেরিয়ালাইজার বা ডেসিরিয়ালাইজার সরাসরি অ্যাসাইন করতে পারেন।
উদাহরণ:
import com.google.gson.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
// কাস্টম সেরিয়ালাইজার
class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
private static final String DATE_FORMAT = "yyyy-MM-dd";
@Override
public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return new JsonPrimitive(sdf.format(date));
}
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
try {
return sdf.parse(json.getAsString());
} catch (Exception e) {
throw new JsonParseException("Invalid date format", e);
}
}
}
// কাস্টম অ্যানোটেশন ব্যবহার
@JsonAdapter(DateAdapter.class)
class Person {
private String name;
private Date birthDate;
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
public String getName() {
return name;
}
public Date getBirthDate() {
return birthDate;
}
}
public class Main {
public static void main(String[] args) {
// Gson তৈরি করা
Gson gson = new Gson();
// Java Object তৈরি করা
Person person = new Person("John Doe", new Date());
// Java Object কে JSON এ কনভার্ট করা
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// JSON থেকে Java Object এ কনভার্ট করা
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + personFromJson.getName() + ", Birth Date: " + personFromJson.getBirthDate());
}
}
ব্যাখ্যা:
- এখানে
Personক্লাসের উপরে@JsonAdapter(DateAdapter.class)অ্যানোটেশন ব্যবহার করা হয়েছে, যাDateটাইপের জন্য কাস্টমDateAdapterঅ্যাডাপ্টার ব্যবহার করবে।
আউটপুট:
Serialized JSON: {"name":"John Doe","birthDate":"2024-12-19"}
Deserialized Person: John Doe, Birth Date: Wed Dec 19 14:56:34 UTC 2024
@JsonAdapterঅ্যানোটেশনটি ক্লাস বা ফিল্ডের জন্য কাস্টম সেরিয়ালাইজার বা ডেসিরিয়ালাইজার অ্যাসাইন করতে ব্যবহৃত হয়।JsonAdapterএবং GsonBuilder এর মাধ্যমে আপনার নিজস্ব কাস্টম কনভার্সন লজিক প্রয়োগ করতে পারেন।
Read more