Jackson লাইব্রেরি Java-এর Enum টাইপের সাথে JSON ডেটা আদান-প্রদানের সময় Serialization (Java থেকে JSON) এবং Deserialization (JSON থেকে Java)-কে সাপোর্ট করে।
Serialization এবং Deserialization কি?
- Serialization: Java Enum-কে JSON ফরম্যাটে রূপান্তর।
- Deserialization: JSON ফরম্যাট থেকে Enum টাইপে রূপান্তর।
Default Behavior
Jackson Enum-এর ক্ষেত্রে ডিফল্টভাবে Enum-এর name() মেথড ব্যবহার করে Serialization এবং valueOf() মেথড ব্যবহার করে Deserialization করে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE,
INACTIVE,
PENDING
}
public class EnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Enum Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "ACTIVE"
// Enum Deserialization
Status status = objectMapper.readValue("\"ACTIVE\"", Status.class);
System.out.println("Deserialized Enum: " + status); // ACTIVE
}
}
Custom Enum Serialization এবং Deserialization
কখনও কখনও Enum-এ কাস্টম স্ট্রিং বা ভিন্ন মান সিরিয়ালাইজ করতে হয়। এই ক্ষেত্রে Jackson-এর @JsonValue এবং @JsonCreator ব্যবহার করা হয়।
কাস্টম মানসহ উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE("active_status"),
INACTIVE("inactive_status"),
PENDING("pending_status");
private final String value;
// Constructor
Status(String value) {
this.value = value;
}
// Serialization এর জন্য
@JsonValue
public String getValue() {
return value;
}
// Deserialization এর জন্য
@JsonCreator
public static Status fromValue(String value) {
for (Status status : Status.values()) {
if (status.value.equals(value)) {
return status;
}
}
throw new IllegalArgumentException("Invalid value: " + value);
}
}
public class CustomEnumExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "active_status"
// Deserialization
Status status = objectMapper.readValue("\"inactive_status\"", Status.class);
System.out.println("Deserialized Enum: " + status); // INACTIVE
}
}
Enum-এর সাথে JSON ফিল্ডসহ কাজ করা
কখনও Enum একটি JSON অবজেক্টের অংশ হতে পারে। উদাহরণস্বরূপ, যখন Enum JSON অবজেক্টের একটি ফিল্ড হিসেবে ব্যবহৃত হয়:
import com.fasterxml.jackson.databind.ObjectMapper;
enum Status {
ACTIVE, INACTIVE, PENDING
}
class User {
private String name;
private Status status;
// Constructor
public User(String name, Status status) {
this.name = name;
this.status = status;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
public class EnumWithObjectExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// User Object তৈরি
User user = new User("John Doe", Status.ACTIVE);
// Serialization
String json = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + json);
// Deserialization
User deserializedUser = objectMapper.readValue(json, User.class);
System.out.println("Deserialized User: " + deserializedUser.getName() + ", " + deserializedUser.getStatus());
}
}
আউটপুট:
Serialized JSON: {"name":"John Doe","status":"ACTIVE"}
Deserialized User: John Doe, ACTIVE
Key Annotations এবং তাদের ভূমিকা
@JsonValue:- Enum-এর সিরিয়ালাইজেশনের সময় একটি নির্দিষ্ট মান (string বা অন্য কিছু) ব্যবহার করতে দেয়।
- উদাহরণ:
"active_status"।
@JsonCreator:- Deserialization-এর সময় JSON থেকে Enum-এ রূপান্তরের নিয়ম নির্ধারণ করে।
- উদাহরণ: JSON ভ্যালু থেকে Enum-এ কাস্টম রূপান্তর।
Custom Serializer এবং Deserializer ব্যবহার:
কখনও ডিফল্ট Jackson মেকানিজম যথেষ্ট না হলে আমরা কাস্টম Serializer/Deserializer ব্যবহার করতে পারি।
Custom Serializer:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class StatusSerializer extends JsonSerializer<Status> {
@Override
public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(status.name().toLowerCase()); // ছোট হরফে Enum নাম
}
}
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 StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
return Status.valueOf(value.toUpperCase()); // বড় হরফে Enum নাম
}
}
Serializer/Deserializer ব্যবহারের উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
public class CustomEnumSerializerExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// মডিউল তৈরি এবং Serializer/Deserializer সেট করা
SimpleModule module = new SimpleModule();
module.addSerializer(Status.class, new StatusSerializer());
module.addDeserializer(Status.class, new StatusDeserializer());
objectMapper.registerModule(module);
// Serialization
String json = objectMapper.writeValueAsString(Status.ACTIVE);
System.out.println("Serialized JSON: " + json); // "active"
// Deserialization
Status status = objectMapper.readValue("\"inactive\"", Status.class);
System.out.println("Deserialized Enum: " + status); // INACTIVE
}
}
- ডিফল্ট Behavior: Enum-এর
name()এবংvalueOf()মেথড ব্যবহার করে। - কাস্টমাইজেশন:
@JsonValueএবং@JsonCreatorদিয়ে সহজ কাস্টমাইজেশন। - Custom Serializer/Deserializer: আরও জটিল প্রয়োজনের জন্য উপযোগী।
- ব্যবহার: API ডেভেলপমেন্টে Enum ডেটা প্রক্রিয়াকরণ ও কাস্টমাইজেশনের জন্য অত্যন্ত কার্যকর।
Read more