Jackson এর মাধ্যমে Enum কাস্টমাইজ করা

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

360

Jackson লাইব্রেরি ডিফল্টভাবে Java Enum কে JSON-এ serialize এবং deserialize করতে পারে। তবে কখনো কখনো আপনাকে Enum-এর ডিফল্ট serialization বা deserialization কাস্টমাইজ করতে হতে পারে। Jackson Enum কাস্টমাইজ করার জন্য অনেক ফিচার সরবরাহ করে, যেমন @JsonValue, @JsonCreator, এবং কাস্টম serializers/deserializers।


ডিফল্ট Enum Serialization এবং Deserialization

ডিফল্টভাবে, Jackson Enum-এর name (যেমন, Enum.name()) serialize করে।

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

public class DefaultEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Enum Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Enum Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

enum Status {
    ACTIVE, INACTIVE, PENDING
}

আউটপুট:

Serialized JSON: "ACTIVE"
Deserialized Enum: ACTIVE

1. @JsonValue এর মাধ্যমে Enum Serialization কাস্টমাইজ করা

@JsonValue ব্যবহার করে Enum কে কাস্টম string, number বা অন্য ফরম্যাটে serialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }
}

public class JsonValueExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

Serialized JSON: "Active Status"

2. @JsonCreator এর মাধ্যমে Enum Deserialization কাস্টমাইজ করা

@JsonCreator ব্যবহার করে JSON থেকে Enum কে কাস্টমভাবে deserialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }

    @JsonCreator
    public static Status forValue(String value) {
        for (Status status : values()) {
            if (status.displayName.equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

public class JsonCreatorExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Deserialization
        Status status = mapper.readValue("\"Active Status\"", Status.class);
        System.out.println("Deserialized Enum: " + status);
    }
}

আউটপুট:

Deserialized Enum: ACTIVE

3. Enum Serialization এবং Deserialization কাস্টম Serializer/Deserializer ব্যবহার করে

Jackson-এ কাস্টম Serializer এবং Deserializer তৈরি করে Enum কাস্টমাইজ করা যায়।

Serializer এবং Deserializer তৈরি:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;

// Custom Serializer
class StatusSerializer extends JsonSerializer<Status> {
    @Override
    public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(status.getDisplayName().toUpperCase());
    }
}

// Custom Deserializer
class StatusDeserializer extends JsonDeserializer<Status> {
    @Override
    public Status deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt)
            throws IOException {
        String value = p.getValueAsString();
        for (Status status : Status.values()) {
            if (status.getDisplayName().equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

// Enum with Custom Serializer/Deserializer
@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    public String getDisplayName() {
        return displayName;
    }
}

ব্যবহার:

public class CustomSerializerDeserializerExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE STATUS\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: "ACTIVE STATUS"
Deserialized Enum: ACTIVE

4. JSON ফিল্ডের মাধ্যমে Enum Map করা

যদি JSON এ Enum ফিল্ড অন্য কোনো ফিল্ডের মান অনুসারে নির্ধারিত হয়, তাহলে এটি কাস্টমভাবে পরিচালনা করতে হয়।

উদাহরণ:

enum PaymentStatus {
    SUCCESS, FAILURE, PENDING
}

class Payment {
    private String transactionId;
    private PaymentStatus status;

    // Getters and Setters
    public String getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }

    public PaymentStatus getStatus() {
        return status;
    }

    public void setStatus(PaymentStatus status) {
        this.status = status;
    }
}

public class PaymentExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // JSON to Object
        String json = """
                      {
                          "transactionId": "TXN12345",
                          "status": "SUCCESS"
                      }
                      """;
        Payment payment = mapper.readValue(json, Payment.class);
        System.out.println("Payment Status: " + payment.getStatus());
    }
}

আউটপুট:

Payment Status: SUCCESS

Jackson-এর মাধ্যমে Enum serialization এবং deserialization কাস্টমাইজ করতে:

  1. @JsonValue এবং @JsonCreator সাধারণত সহজ এবং কার্যকর।
  2. কাস্টম Serializer/Deserializer জটিল কেসের জন্য প্রয়োজন।
  3. API-এর ভিন্ন ভিন্ন কনটেক্সটে Enum কাস্টমাইজ করার জন্য কাস্টমাইজেশন গুরুত্বপূর্ণ।

আপনার প্রয়োজনের উপর নির্ভর করে সঠিক পদ্ধতি নির্বাচন করুন।

Content added By
Promotion

Are you sure to start over?

Loading...