Enum Serialization এবং Deserialization

Enum হ্যান্ডল করা - জ্যাকসন (Jackson) - Java Technologies

351

Jackson লাইব্রেরি Java-এর Enum টাইপের সাথে JSON ডেটা আদান-প্রদানের সময় Serialization (Java থেকে JSON) এবং Deserialization (JSON থেকে Java)-কে সাপোর্ট করে।


Serialization এবং Deserialization কি?

  1. Serialization: Java Enum-কে JSON ফরম্যাটে রূপান্তর।
  2. 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 এবং তাদের ভূমিকা

  1. @JsonValue:
    • Enum-এর সিরিয়ালাইজেশনের সময় একটি নির্দিষ্ট মান (string বা অন্য কিছু) ব্যবহার করতে দেয়।
    • উদাহরণ: "active_status"
  2. @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
    }
}

  1. ডিফল্ট Behavior: Enum-এর name() এবং valueOf() মেথড ব্যবহার করে।
  2. কাস্টমাইজেশন: @JsonValue এবং @JsonCreator দিয়ে সহজ কাস্টমাইজেশন।
  3. Custom Serializer/Deserializer: আরও জটিল প্রয়োজনের জন্য উপযোগী।
  4. ব্যবহার: API ডেভেলপমেন্টে Enum ডেটা প্রক্রিয়াকরণ ও কাস্টমাইজেশনের জন্য অত্যন্ত কার্যকর।
Content added By
Promotion

Are you sure to start over?

Loading...