Gson এর সাথে Enum কনফিগারেশন ব্যবহারের মাধ্যমে আপনি Java-এর Enum টাইপের ডেটাকে JSON-এ কাস্টমাইজ করে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন। Gson স্বয়ংক্রিয়ভাবে Enum টাইপের ডেটা কনভার্ট করে, তবে আপনি কিছু বিশেষ কনফিগারেশনও প্রয়োগ করতে পারেন, যেমন Enum-এর স্ট্রিং ভ্যালু পরিবর্তন করা বা কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রয়োগ করা।
1. Gson-এর সাথে Enum ব্যবহার:
যেহেতু Gson স্বয়ংক্রিয়ভাবে Enum ফিল্ডগুলোকে JSON-এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারে, তাই সাধারণ Enum ক্লাস ব্যবহার করা যেতে পারে।
উদাহরণ:
import com.google.gson.Gson;
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
class User {
String name;
Status status;
public User(String name, Status status) {
this.name = name;
this.status = status;
}
}
public class Main {
public static void main(String[] args) {
// একটি User অবজেক্ট তৈরি করুন
User user = new User("John Doe", Status.ACTIVE);
// Gson অবজেক্ট তৈরি করুন
Gson gson = new Gson();
// User অবজেক্টকে JSON-এ রূপান্তর করুন
String json = gson.toJson(user);
// JSON আউটপুট প্রিন্ট করুন
System.out.println(json);
}
}
আউটপুট:
{"name":"John Doe","status":"ACTIVE"}
এখানে Status enum-এর মান ACTIVE JSON-এ "status": "ACTIVE" হিসাবে সিরিয়ালাইজ হয়েছে।
2. Gson-এ Enum-এর কাস্টম সিরিয়ালাইজেশন (Custom Serialization):
কখনও কখনও আপনি চাইবেন না যে Enum এর ডিফল্ট মান (যেমন, ACTIVE, INACTIVE) সরাসরি JSON-এ সিরিয়ালাইজ করা হোক। আপনি JsonSerializer ব্যবহার করে Enum-এর কাস্টম সিরিয়ালাইজেশন তৈরি করতে পারেন।
উদাহরণ:
ধরা যাক, আপনি Enum মানগুলিকে ছোট হাতের স্ট্রিং (lowercase string) হিসেবে সিরিয়ালাইজ করতে চান।
import com.google.gson.*;
import java.lang.reflect.Type;
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
class User {
String name;
Status status;
public User(String name, Status status) {
this.name = name;
this.status = status;
}
}
class StatusSerializer implements JsonSerializer<Status> {
@Override
public JsonElement serialize(Status status, Type typeOfSrc, JsonSerializationContext context) {
// Enum মানটি lowercase আকারে JSON-এ রূপান্তর করা
return new JsonPrimitive(status.name().toLowerCase());
}
}
public class Main {
public static void main(String[] args) {
User user = new User("John Doe", Status.ACTIVE);
// GsonBuilder ব্যবহার করে কাস্টম সিরিয়ালাইজার নিবন্ধিত করুন
Gson gson = new GsonBuilder()
.registerTypeAdapter(Status.class, new StatusSerializer())
.create();
// User অবজেক্টকে JSON-এ রূপান্তর করুন
String json = gson.toJson(user);
// JSON আউটপুট প্রিন্ট করুন
System.out.println(json);
}
}
আউটপুট:
{"name":"John Doe","status":"active"}
এখানে ACTIVE Enum মানটি active হিসেবে JSON-এ সিরিয়ালাইজ হয়েছে, যেহেতু আমরা StatusSerializer কাস্টম সিরিয়ালাইজার তৈরি করেছি যা Enum মানটিকে lowercase আকারে রূপান্তর করে।
3. Gson-এ Enum-এর কাস্টম ডেসিরিয়ালাইজেশন (Custom Deserialization):
যখন JSON থেকে Java Enum অবজেক্টে রূপান্তর করতে চান, তখন JsonDeserializer ব্যবহার করে আপনি কাস্টম ডেসিরিয়ালাইজেশনও করতে পারেন।
উদাহরণ:
ধরা যাক, JSON এ "active", "inactive" ইত্যাদি স্ট্রিং ব্যবহার করা হয়েছে, কিন্তু Java Enum এ ACTIVE, INACTIVE এই নামগুলো রয়েছে। এই মানগুলোকে কাস্টম ডেসিরিয়ালাইজ করতে নিচের কোড ব্যবহার করা যায়:
import com.google.gson.*;
import java.lang.reflect.Type;
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
class User {
String name;
Status status;
public User(String name, Status status) {
this.name = name;
this.status = status;
}
}
class StatusDeserializer implements JsonDeserializer<Status> {
@Override
public Status deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String status = json.getAsString().toUpperCase(); // lowercase থেকে uppercase এ রূপান্তর
return Status.valueOf(status);
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John Doe\", \"status\":\"active\"}";
// GsonBuilder ব্যবহার করে কাস্টম ডেসিরিয়ালাইজার নিবন্ধিত করুন
Gson gson = new GsonBuilder()
.registerTypeAdapter(Status.class, new StatusDeserializer())
.create();
// JSON স্ট্রিং থেকে User অবজেক্টে রূপান্তর করুন
User user = gson.fromJson(json, User.class);
// User অবজেক্টের মান প্রিন্ট করুন
System.out.println("Name: " + user.name);
System.out.println("Status: " + user.status);
}
}
আউটপুট:
Name: John Doe
Status: ACTIVE
এখানে JSON স্ট্রিং "status": "active" থেকে Status.ACTIVE এ রূপান্তরিত হয়েছে, কারণ আমরা StatusDeserializer কাস্টম ডেসিরিয়ালাইজার তৈরি করেছি যা JSON থেকে Enum অবজেক্টে কাস্টম রূপান্তর করে।
4. @SerializedName এবং Enum এর সাথে ব্যবহার:
আপনি যদি Enum-এর সাথে JSON স্ট্রিং ম্যাপ করতে চান, তবে @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন।
উদাহরণ:
import com.google.gson.annotations.SerializedName;
enum Status {
@SerializedName("active_status")
ACTIVE,
@SerializedName("inactive_status")
INACTIVE,
@SerializedName("pending_status")
PENDING
}
class User {
String name;
Status status;
public User(String name, Status status) {
this.name = name;
this.status = status;
}
}
public class Main {
public static void main(String[] args) {
// JSON স্ট্রিং
String json = "{\"name\":\"John Doe\", \"status\":\"active_status\"}";
// Gson অবজেক্ট তৈরি করুন
Gson gson = new Gson();
// JSON স্ট্রিং থেকে User অবজেক্টে রূপান্তর করুন
User user = gson.fromJson(json, User.class);
System.out.println("Name: " + user.name);
System.out.println("Status: " + user.status);
}
}
আউটপুট:
Name: John Doe
Status: ACTIVE
এখানে active_status JSON ভ্যালু Status.ACTIVE Enum-এর মানের সাথে যুক্ত হয়েছে কারণ আমরা @SerializedName ব্যবহার করেছি।
সারসংক্ষেপ:
- ডিফল্ট Enum সিরিয়ালাইজেশন/ডেসিরিয়ালাইজেশন: Gson Enum এর জন্য ডিফল্ট সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন সমর্থন করে।
- কাস্টম সিরিয়ালাইজেশন:
JsonSerializerইন্টারফেস ব্যবহার করে Enum এর কাস্টম সিরিয়ালাইজেশন করতে পারেন। - কাস্টম ডেসিরিয়ালাইজেশন:
JsonDeserializerইন্টারফেস ব্যবহার করে Enum এর কাস্টম ডেসিরিয়ালাইজেশন করতে পারেন। @SerializedName: Enum মানের জন্য JSON এর কাস্টম নাম ম্যাপ করার জন্য ব্যবহৃত হয়।
এভাবে আপনি Gson এর সাথে Enum টাইপের ডেটা কাস্টমাইজ করে JSON এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন।
Read more