Skill

Gson এবং Enums ব্যবস্থাপনা

জিসন (Gson) - Java Technologies

481

Gson ব্যবহার করে Enum টাইপের ডেটা ডেসিরিয়ালাইজ (JSON থেকে Java object) এবং সিরিয়ালাইজ (Java object থেকে JSON) করতে, আপনি সাধারণত Enum ক্লাসের মানগুলিকে স্ট্রিং হিসাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করবেন। তবে, আপনি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করে Enum এর জন্য কাস্টম প্রক্রিয়া তৈরি করতে পারেন।

1. সাধারণ Enum সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন:

Gson ডিফল্টভাবে Enum কে স্ট্রিং হিসেবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করে। উদাহরণস্বরূপ, যদি আপনার একটি Enum ক্লাস থাকে:

public enum Status {
    PENDING,
    COMPLETED,
    CANCELLED
}

সাধারণ সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন:

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        // Enum instance
        Status status = Status.PENDING;

        // Gson ইনস্ট্যান্স তৈরি
        Gson gson = new Gson();

        // Enum instance সিরিয়ালাইজ করা
        String json = gson.toJson(status);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Enum instance ডেসিরিয়ালাইজ করা
        Status deserializedStatus = gson.fromJson(json, Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: "PENDING"
Deserialized Enum: PENDING

এখানে Gson ডিফল্টভাবে Enum মানটিকে স্ট্রিং হিসেবে সিরিয়ালাইজ করেছে এবং স্ট্রিং থেকে Enum মানে ডেসিরিয়ালাইজ করেছে।

2. কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন:

আপনি যদি Enum এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করতে চান, তবে JsonSerializer এবং JsonDeserializer ইন্টারফেস ব্যবহার করতে পারেন।

উদাহরণ:

ধরা যাক, আপনি চান Enum এর মান কেবল ছোট হাতের অক্ষরে স্ট্রিং হিসেবে সিরিয়ালাইজ হোক এবং স্ট্রিং থেকে Enum ডেসিরিয়ালাইজ করার সময় এই মানকে বড় হাতের অক্ষরে রূপান্তর করতে হবে।

import com.google.gson.*;
import java.lang.reflect.Type;

public enum Status {
    PENDING,
    COMPLETED,
    CANCELLED
}

// কাস্টম সিরিয়ালাইজার
class StatusSerializer implements JsonSerializer<Status> {
    @Override
    public JsonElement serialize(Status status, Type typeOfSrc, JsonSerializationContext context) {
        // স্ট্রিং মানকে ছোট হাতের অক্ষরে কনভার্ট করা
        return new JsonPrimitive(status.name().toLowerCase());
    }
}

// কাস্টম ডেসিরিয়ালাইজার
class StatusDeserializer implements JsonDeserializer<Status> {
    @Override
    public Status deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // স্ট্রিং মানকে বড় হাতের অক্ষরে কনভার্ট করে Enum এ ডেসিরিয়ালাইজ করা
        return Status.valueOf(json.getAsString().toUpperCase());
    }
}

public class Main {
    public static void main(String[] args) {
        // Enum instance
        Status status = Status.PENDING;

        // Gson ইনস্ট্যান্স তৈরি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার সহ
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Status.class, new StatusSerializer())
                        .registerTypeAdapter(Status.class, new StatusDeserializer())
                        .create();

        // Enum instance সিরিয়ালাইজ করা
        String json = gson.toJson(status);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Enum instance ডেসিরিয়ালাইজ করা
        Status deserializedStatus = gson.fromJson(json, Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: "pending"
Deserialized Enum: PENDING

ব্যাখ্যা:

  1. StatusSerializer: এই কাস্টম সিরিয়ালাইজার Enum মানটিকে স্ট্রিংয়ে কনভার্ট করার আগে তাকে ছোট হাতের অক্ষরে রূপান্তরিত করে।
  2. StatusDeserializer: এই কাস্টম ডেসিরিয়ালাইজার স্ট্রিং মানকে বড় হাতের অক্ষরে রূপান্তরিত করে এবং তারপর তা Enum এর মানে ডেসিরিয়ালাইজ করে।

3. অন্য কাস্টম Enum মান ব্যবস্থাপনা:

ধরা যাক, আপনি চান Enum কে অন্য কোনো মানে সিরিয়ালাইজ করতে, যেমন 1 এবং 2 ইত্যাদি। তখনও আপনি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করতে পারেন।

উদাহরণ:

import com.google.gson.*;

public enum Status {
    PENDING(1),
    COMPLETED(2),
    CANCELLED(3);

    private final int value;

    Status(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static Status fromValue(int value) {
        for (Status status : Status.values()) {
            if (status.getValue() == value) {
                return status;
            }
        }
        return null;
    }
}

// কাস্টম সিরিয়ালাইজার
class StatusSerializer implements JsonSerializer<Status> {
    @Override
    public JsonElement serialize(Status status, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(status.getValue());
    }
}

// কাস্টম ডেসিরিয়ালাইজার
class StatusDeserializer implements JsonDeserializer<Status> {
    @Override
    public Status deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Status.fromValue(json.getAsInt());
    }
}

public class Main {
    public static void main(String[] args) {
        // Enum instance
        Status status = Status.PENDING;

        // Gson ইনস্ট্যান্স তৈরি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার সহ
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Status.class, new StatusSerializer())
                        .registerTypeAdapter(Status.class, new StatusDeserializer())
                        .create();

        // Enum instance সিরিয়ালাইজ করা
        String json = gson.toJson(status);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Enum instance ডেসিরিয়ালাইজ করা
        Status deserializedStatus = gson.fromJson(json, Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: 1
Deserialized Enum: PENDING

সারাংশ:

  • Gson ডিফল্টভাবে Enum টাইপের মানকে স্ট্রিং হিসেবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করে।
  • আপনি কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার ব্যবহার করে Enum মানকে অন্যান্য ফরম্যাটে (যেমন: সংখ্যা বা ছোট হাতের অক্ষর) সিরিয়ালাইজ ও ডেসিরিয়ালাইজ করতে পারেন।
  • কাস্টম লজিক প্রয়োগের মাধ্যমে Enum ফিল্ডগুলির জন্য কাস্টম রূপান্তর তৈরি করা সম্ভব।
Content added By

Enum হল একটি বিশেষ ধরনের ডেটা টাইপ যা একটি নির্দিষ্ট সীমিত সেটের মান ধারণ করে। Gson লাইব্রেরি Enum-কে JSON ডেটাতে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সমর্থ, তবে আপনি কখনো কখনো Enum-এর মান কাস্টমাইজ করতে চাইতে পারেন। Gson স্বয়ংক্রিয়ভাবে Enum-কে JSON স্ট্রিং হিসাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করে, তবে Enum-এ কাস্টম নাম বা মান ব্যবহারের জন্য কিছু কাস্টম কনফিগারেশনও করা যায়।

এখানে আমরা দেখবো কিভাবে Gson ব্যবহার করে Enum-এর Serialization (সিরিয়ালাইজেশন) এবং Deserialization (ডেসিরিয়ালাইজেশন) করা যায়।


1. Enum Serialization (সিরিয়ালাইজেশন)

Serialization বা সিরিয়ালাইজেশন এর মাধ্যমে একটি Java Enum অবজেক্টকে JSON ডেটা হিসেবে রূপান্তরিত করা হয়। Gson ডিফল্টভাবে Enum-এর নাম (যেমন RED, GREEN, BLUE) JSON স্ট্রিং হিসেবে রূপান্তর করে।

উদাহরণ: Enum Serialization

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        // Enum অবজেক্ট তৈরি করা
        Color color = Color.RED;

        // Gson অবজেক্ট তৈরি
        Gson gson = new Gson();

        // Enum অবজেক্ট থেকে JSON সিরিয়ালাইজ করা
        String json = gson.toJson(color);
        System.out.println("Serialized Enum: " + json);
    }
}

enum Color {
    RED, GREEN, BLUE;
}

আউটপুট:

Serialized Enum: "RED"

ব্যাখ্যা:

  • এখানে Color.RED Enum-কে Gson JSON স্ট্রিং "RED" হিসেবে সিরিয়ালাইজ করেছে, যা Enum এর ডিফল্ট নাম।

2. Enum Deserialization (ডেসিরিয়ালাইজেশন)

Deserialization বা ডেসিরিয়ালাইজেশন হল JSON ডেটা থেকে Java Enum অবজেক্টে রূপান্তর করা। Gson ডিফল্টভাবে JSON স্ট্রিং (যেমন "RED", "GREEN", "BLUE") কে Enum-এর মানে রূপান্তর করে।

উদাহরণ: Enum Deserialization

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        String json = "\"GREEN\"";

        // Gson অবজেক্ট তৈরি
        Gson gson = new Gson();

        // JSON থেকে Enum অবজেক্টে ডেসিরিয়ালাইজ করা
        Color color = gson.fromJson(json, Color.class);
        System.out.println("Deserialized Enum: " + color);
    }
}

enum Color {
    RED, GREEN, BLUE;
}

আউটপুট:

Deserialized Enum: GREEN

ব্যাখ্যা:

  • এখানে json স্ট্রিং "GREEN" থেকে Gson Enum Color.GREEN এ রূপান্তর করেছে।

3. Enum Serialization and Deserialization with Custom Values

কখনো কখনো আপনি চান যে Enum-এ নির্দিষ্ট মান ব্যবহার করা হোক, যেমন Enum-এর নামের পরিবর্তে কিছু কাস্টম মান। এ জন্য Gson-এ কাস্টম Serializer এবং Deserializer তৈরি করা যেতে পারে।

উদাহরণ: কাস্টম Enum Serialization এবং Deserialization

import com.google.gson.*;
import java.lang.reflect.Type;

public class Main {
    public static void main(String[] args) {
        // Enum অবজেক্ট তৈরি
        Status status = Status.SUCCESS;

        // GsonBuilder দিয়ে কাস্টম Serializer এবং Deserializer ব্যবহার করা
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Status.class, new StatusSerializer())
                        .registerTypeAdapter(Status.class, new StatusDeserializer())
                        .create();

        // Enum অবজেক্ট থেকে JSON সিরিয়ালাইজ করা
        String json = gson.toJson(status);
        System.out.println("Serialized Enum with Custom Value: " + json);

        // JSON থেকে Enum অবজেক্টে ডেসিরিয়ালাইজ করা
        Status deserializedStatus = gson.fromJson(json, Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

// Enum ক্লাস
enum Status {
    SUCCESS("200"), FAILURE("500");

    private final String code;

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

    public String getCode() {
        return code;
    }

    public static Status fromCode(String code) {
        for (Status status : Status.values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }
}

// কাস্টম Serializer
class StatusSerializer implements JsonSerializer<Status> {
    @Override
    public JsonElement serialize(Status status, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(status.getCode());  // কাস্টম মান (code) সিরিয়ালাইজ
    }
}

// কাস্টম Deserializer
class StatusDeserializer implements JsonDeserializer<Status> {
    @Override
    public Status deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Status.fromCode(json.getAsString());  // কাস্টম মান (code) অনুযায়ী ডেসিরিয়ালাইজ
    }
}

আউটপুট:

Serialized Enum with Custom Value: "200"
Deserialized Enum: SUCCESS

ব্যাখ্যা:

  • এই উদাহরণে Status Enum-এ SUCCESS এবং FAILURE এর পরিবর্তে আমরা 200 এবং 500 কোড ব্যবহার করেছি। Gson এর কাস্টম Serializer এবং Deserializer-এর মাধ্যমে আমরা কাস্টম মান (যেমন 200 এবং 500) JSON আউটপুটে ব্যবহার করেছি।
  • সিরিয়ালাইজেশনের সময় Status.SUCCESS Enum কে "200" হিসেবে রূপান্তরিত করা হয়েছে, এবং ডেসিরিয়ালাইজেশনের সময় "200" থেকে Status.SUCCESS Enum তৈরি করা হয়েছে।

4. Enum with Complex Values (Complex Enum)

Enum এর সাথে যদি আরও বেশি ডেটা থাকে, যেমন একটি Enum অবজেক্টে একাধিক প্রপার্টি, তাহলে আপনি কাস্টম Serializer এবং Deserializer ব্যবহার করে সেগুলি নিয়ন্ত্রণ করতে পারবেন।

উদাহরণ: Complex Enum

import com.google.gson.*;
import java.lang.reflect.Type;

public class Main {
    public static void main(String[] args) {
        // Complex Enum অবজেক্ট তৈরি
        Job job = Job.DEVELOPER;

        // GsonBuilder দিয়ে কাস্টম Serializer এবং Deserializer ব্যবহার করা
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Job.class, new JobSerializer())
                        .registerTypeAdapter(Job.class, new JobDeserializer())
                        .create();

        // Enum অবজেক্ট থেকে JSON সিরিয়ালাইজ করা
        String json = gson.toJson(job);
        System.out.println("Serialized Complex Enum: " + json);

        // JSON থেকে Enum অবজেক্টে ডেসিরিয়ালাইজ করা
        Job deserializedJob = gson.fromJson(json, Job.class);
        System.out.println("Deserialized Complex Enum: " + deserializedJob);
    }
}

// Complex Enum ক্লাস
enum Job {
    DEVELOPER("Dev", 5000),
    MANAGER("Mngr", 8000);

    private final String code;
    private final int salary;

    Job(String code, int salary) {
        this.code = code;
        this.salary = salary;
    }

    public String getCode() {
        return code;
    }

    public int getSalary() {
        return salary;
    }

    public static Job fromCode(String code) {
        for (Job job : Job.values()) {
            if (job.getCode().equals(code)) {
                return job;
            }
        }
        return null;
    }
}

// Complex Enum Serializer
class JobSerializer implements JsonSerializer<Job> {
    @Override
    public JsonElement serialize(Job job, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("code", job.getCode());
        jsonObject.addProperty("salary", job.getSalary());
        return jsonObject;
    }
}

// Complex Enum Deserializer
class JobDeserializer implements JsonDeserializer<Job> {
    @Override
    public Job deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String code = jsonObject.get("code").getAsString();
        return Job.fromCode(code);
    }
}

আউটপুট:

Serialized Complex Enum: {"code":"Dev","salary":5000}
Deserialized Complex Enum: DEVELOPER

ব্যাখ্যা:

  • এখানে Job Enum-এ code এবং salary নামে দুটি প্রপার্টি আছে।
  • Gson কাস্টম Serializer এবং Deserializer ব্যবহার করে code এবং salary JSON ফিল্ড হিসেবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করছে।

Gson-এ Enum Serialization এবং Deserialization সহজেই করা যায়। ডিফল্টভাবে, Gson Enum নামকে JSON স্ট্রিং হিসেবে রূপান্তর করে। তবে, আপনি কাস্টম Serializer এবং Deserializer ব্যবহার করে Enum-এর কাস্টম মান এবং জটিল ডেটা কাস্টমাইজ করতে পারেন। এটা আপনাকে আরও নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে, যখন Enum-কে JSON ডেটাতে রূপান্তর করতে হয়।

Content added By

Gson দিয়ে আপনি Enum টাইপের জন্য custom serialization এবং deserialization তৈরি করতে পারেন। Enum সাধারণত নির্দিষ্ট সেটের মান দিয়ে গঠিত একটি ডেটা টাইপ, এবং Gson এর মাধ্যমে আপনি সহজেই Enum এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন তৈরি করতে পারেন।

১. Enum এর জন্য Custom Serializer এবং Deserializer তৈরি করা

Gson দিয়ে Enum টাইপের জন্য কাস্টম সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন করার জন্য, আপনাকে JsonSerializer এবং JsonDeserializer ইন্টারফেস ইমপ্লিমেন্ট করতে হবে। এই ইন্টারফেসগুলো আপনাকে JSON রূপান্তর কাস্টমাইজ করতে সাহায্য করবে।


২. Enum Example:

ধরা যাক, আমাদের একটি Day enum আছে, যেখানে সপ্তাহের দিনগুলির জন্য মান রয়েছে:

public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

আমরা এই enum এর জন্য কাস্টম সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন তৈরি করতে যাচ্ছি, যাতে JSON এ সপ্তাহের দিনটি ছোট হাতের অক্ষরে (mon, tue ইত্যাদি) হিসেবে দেখানো হয় এবং ইনপুটেও সেই মান গ্রহণ করা যায়।


৩. Custom Serializer এবং Deserializer

3.1. Custom Serializer:

JsonSerializer ইন্টারফেস ইমপ্লিমেন্ট করে আমরা কাস্টম সিরিয়ালাইজার তৈরি করতে পারি। এখানে আমরা Enum কে ছোট হাতের অক্ষরে রূপান্তর করব।

import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;

public class DaySerializer implements JsonSerializer<Day> {
    @Override
    public JsonElement serialize(Day src, Type typeOfSrc, JsonSerializationContext context) {
        // Enum কে ছোট হাতের অক্ষরে রূপান্তর করা
        return context.serialize(src.name().toLowerCase());
    }
}

3.2. Custom Deserializer:

JsonDeserializer ইন্টারফেস ইমপ্লিমেন্ট করে আমরা কাস্টম ডিজিরিয়ালাইজার তৈরি করতে পারি। এখানে আমরা JSON এর ছোট হাতের মানটি Day enum এ রূপান্তর করব।

import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonDeserializer;
import java.lang.reflect.Type;

public class DayDeserializer implements JsonDeserializer<Day> {
    @Override
    public Day deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // JSON এর ছোট হাতের মান থেকে Enum টাইপে রূপান্তর করা
        return Day.valueOf(json.getAsString().toUpperCase());
    }
}

৪. GsonBuilder দিয়ে Custom Serializer এবং Deserializer ব্যবহার করা

GsonBuilder ব্যবহার করে আমরা কাস্টম সিরিয়ালাইজার এবং ডিজিরিয়ালাইজার যোগ করতে পারি। নিচে পুরো প্রক্রিয়া দেখানো হলো:

Complete Example with Custom Serializer and Deserializer:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        // GsonBuilder দিয়ে কাস্টম Serializer এবং Deserializer যোগ করা
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Day.class, new DaySerializer())  // Custom Serializer
                        .registerTypeAdapter(Day.class, new DayDeserializer()) // Custom Deserializer
                        .create();

        // Enum value
        Day day = Day.MONDAY;
        
        // Serialize Enum to JSON
        String json = gson.toJson(day);
        System.out.println("Serialized JSON: " + json);  // Output: "mon"

        // Deserialize JSON to Enum
        Day deserializedDay = gson.fromJson("\"mon\"", Day.class);
        System.out.println("Deserialized Enum: " + deserializedDay);  // Output: MONDAY
    }
}

Output:

Serialized JSON: "mon"
Deserialized Enum: MONDAY

এখানে, আমরা কাস্টম সিরিয়ালাইজার এবং ডিজিরিয়ালাইজার ব্যবহার করে Day enum এর JSON রূপান্তর কাস্টমাইজ করেছি:

  • Serialization: MONDAY enum value কে "mon" এ রূপান্তর করা হয়েছে।
  • Deserialization: "mon" থেকে MONDAY enum value রূপান্তর করা হয়েছে।

৫. কাস্টম Serializer এবং Deserializer ব্যবহার করার সুবিধা

  1. মান কাস্টমাইজেশন: JSON এ enum এর মান কাস্টমভাবে ফরম্যাট করতে পারবেন (যেমন, ছোট হাতের অক্ষর, বা বিশেষ কোনো ফরম্যাটে)।
  2. ইনপুট নিয়ন্ত্রণ: JSON থেকে enum এ ইনপুটকে কাস্টম পদ্ধতিতে রূপান্তরিত করতে পারবেন (যেমন, ছোট হাতের অক্ষরের মানকে enum এর বড় হাতের রূপে রূপান্তর)।
  3. ফ্লেক্সিবিলিটি: Gson আপনাকে কাস্টম লজিক প্রয়োগ করার জন্য সম্পূর্ণ নিয়ন্ত্রণ দেয়, যেমন: enum নামের পরিবর্তে কোনো ভিন্ন মানের জন্য JSON ফরম্যাট তৈরি করা।

Gson এর মাধ্যমে Enum এর জন্য custom serializer এবং deserializer তৈরি করা সহজ। আপনি JsonSerializer এবং JsonDeserializer ইন্টারফেস ইমপ্লিমেন্ট করে কাস্টম রূপান্তর তৈরি করতে পারেন যা আপনার JSON ডেটার প্রক্রিয়াকে আরো নমনীয় এবং নিয়ন্ত্রিত করে।

Content added By

Gson ব্যবহার করে JSON ডেটার সাথে Enum Mapping এবং Complex JSON Structure পরিচালনা করা যায়। Gson এ Enum এবং Complex JSON Structure ম্যানিপুলেশন একটি সাধারণ কিন্তু গুরুত্বপূর্ণ কাজ, বিশেষ করে যখন আপনি JSON ডেটাকে Java অবজেক্টে রূপান্তর করতে চান এবং এর মধ্যে এনাম বা জটিল (nested) স্ট্রাকচার থাকে।

এখানে, আমি Enum Mapping এবং Complex JSON Structure ম্যানিপুলেশনের উদাহরণসহ ব্যাখ্যা করবো।


1. Gson Enum Mapping

Enum একটি বিশেষ ধরনের ক্লাস যা সীমিত মান (constant) ধারণ করে। Gson আপনাকে JSON ডেটার সাথে Enum মান ম্যানিপুলেট করার সুযোগ দেয়।

Enum Mapping এর মাধ্যমে JSON থেকে Java Enum-এ রূপান্তর

এটি করার জন্য Gson আপনাকে EnumSerializer এবং EnumDeserializer ব্যবহার করার সুবিধা দেয়, অথবা সিম্পলভাবে @SerializedName অ্যানোটেশন ব্যবহার করেও JSON মানকে Enum-এর সাথে মাপা (map) করতে পারেন।

এনাম ক্লাস উদাহরণ:

enum Status {
    ACTIVE, INACTIVE, PENDING;
}

JSON উদাহরণ (with Enum):

{
    "status": "ACTIVE"
}

Java Class (with Enum):

class User {
    String name;
    Status status;

    public User(String name, Status status) {
        this.name = name;
        this.status = status;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', status=" + status + "}";
    }
}

Enum Mapping (Deserialize JSON to Java Enum):

import com.google.gson.*;

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"Rahim\", \"status\":\"ACTIVE\"}";

        Gson gson = new Gson();

        // Deserialize JSON to Java Object with Enum mapping
        User user = gson.fromJson(json, User.class);
        System.out.println(user);
    }
}

আউটপুট:

User{name='Rahim', status=ACTIVE}

এখানে, status ফিল্ডটি "ACTIVE" স্ট্রিং মানে থাকা সত্ত্বেও Gson তা Status এনাম-এ রূপান্তরিত করেছে।

Custom Enum Mapping (Using @SerializedName)

কখনো কখনো আপনার JSON ফাইলের মান এনামের সাথে মেলানো কঠিন হতে পারে (যেমন, "active" মানটি "ACTIVE" এনামের সাথে মেলানো)। এই ক্ষেত্রে, আপনি @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন।

enum Status {
    @SerializedName("active") ACTIVE,
    @SerializedName("inactive") INACTIVE,
    @SerializedName("pending") PENDING;
}

এখন JSON এর "active" মান "ACTIVE" এনামে ম্যাপ হবে।


2. Gson Complex JSON Structure (Nested JSON)

Complex JSON structure-এ বিভিন্ন nested objects এবং arrays থাকতে পারে। Gson সহজে এই ধরনের জটিল JSON কাঠামোকে Java অবজেক্টে রূপান্তর করতে সহায়তা করে।

Complex JSON Example (Nested Objects and Arrays)

JSON (Complex Structure):

{
  "user": {
    "name": "Rahim",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Dhaka"
    },
    "phones": [
      "1234567890",
      "9876543210"
    ]
  }
}

এখানে, user একটি নেস্টেড অবজেক্ট এবং phones একটি অ্যারে।

Java Class for Complex Structure:

class Address {
    String street;
    String city;
}

class User {
    String name;
    int age;
    Address address;  // Nested object
    List<String> phones;  // Array

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + ", address=" + address + ", phones=" + phones + "}";
    }
}

Complex JSON Structure Deserialization:

import com.google.gson.*;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String json = "{\"user\": {\"name\":\"Rahim\", \"age\":30, \"address\": {\"street\":\"123 Main St\", \"city\":\"Dhaka\"}, \"phones\": [\"1234567890\", \"9876543210\"]}}";
        
        // Create Gson object to parse JSON
        Gson gson = new Gson();
        
        // Deserialize JSON to Java object
        JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
        JsonObject userObject = jsonObject.getAsJsonObject("user");
        User user = gson.fromJson(userObject, User.class);
        
        // Print the deserialized user object
        System.out.println(user);
    }
}

আউটপুট:

User{name='Rahim', age=30, address=Address{street='123 Main St', city='Dhaka'}, phones=[1234567890, 9876543210]}

এখানে, Gson JSON এর user অবজেক্ট থেকে User ক্লাসের অবজেক্ট তৈরি করেছে এবং একইভাবে address একটি নেস্টেড অবজেক্ট এবং phones একটি অ্যারে হিসাবে রূপান্তরিত হয়েছে।


Complex JSON Structure with Custom Deserialization

কখনো কখনো আপনাকে একটি কাস্টম ডেসেরিয়ালাইজার ব্যবহার করতে হতে পারে, বিশেষত যদি JSON স্ট্রাকচার খুবই জটিল বা কাস্টম হয়।

Custom Deserializer for Complex JSON:

class CustomUserDeserializer implements JsonDeserializer<User> {
    @Override
    public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        JsonObject userJson = jsonObject.getAsJsonObject("user");
        
        String name = userJson.get("name").getAsString();
        int age = userJson.get("age").getAsInt();
        
        JsonObject addressJson = userJson.getAsJsonObject("address");
        Address address = new Address();
        address.street = addressJson.get("street").getAsString();
        address.city = addressJson.get("city").getAsString();
        
        List<String> phones = new Gson().fromJson(userJson.getAsJsonArray("phones"), List.class);
        
        User user = new User();
        user.name = name;
        user.age = age;
        user.address = address;
        user.phones = phones;
        
        return user;
    }
}

Using Custom Deserializer:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new CustomUserDeserializer());
Gson gson = gsonBuilder.create();
User user = gson.fromJson(json, User.class);

এভাবে, আপনি কাস্টম ডেসেরিয়ালাইজার ব্যবহার করে জটিল JSON স্ট্রাকচারকে Java অবজেক্টে রূপান্তর করতে পারেন।


সারাংশ:

  1. Enum Mapping: Gson স্বাভাবিকভাবে JSON স্ট্রিংকে Java Enum-এ রূপান্তর করতে সহায়তা করে। আপনি @SerializedName অ্যানোটেশন ব্যবহার করে কাস্টম Enum মানও ম্যাপ করতে পারেন।
  2. Complex JSON Structure: Gson সহজে nested objects এবং arrays সহ complex JSON ডেটা Java অবজেক্টে রূপান্তর করতে সহায়তা করে। যদি JSON স্ট্রাকচার খুব জটিল হয়, তবে কাস্টম Deserializer ব্যবহার করে সেটি হ্যান্ডেল করা যায়।

Gson এই কাজগুলোকে খুবই সহজ এবং কার্যকরী করে তোলে, যা JSON এবং Java অবজেক্টের মধ্যে রূপান্তরকে অনেক দ্রুত এবং আরো কার্যকরী করে তোলে।

Content added By

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 ব্যবহার করেছি।


সারসংক্ষেপ:

  1. ডিফল্ট Enum সিরিয়ালাইজেশন/ডেসিরিয়ালাইজেশন: Gson Enum এর জন্য ডিফল্ট সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন সমর্থন করে।
  2. কাস্টম সিরিয়ালাইজেশন: JsonSerializer ইন্টারফেস ব্যবহার করে Enum এর কাস্টম সিরিয়ালাইজেশন করতে পারেন।
  3. কাস্টম ডেসিরিয়ালাইজেশন: JsonDeserializer ইন্টারফেস ব্যবহার করে Enum এর কাস্টম ডেসিরিয়ালাইজেশন করতে পারেন।
  4. @SerializedName: Enum মানের জন্য JSON এর কাস্টম নাম ম্যাপ করার জন্য ব্যবহৃত হয়।

এভাবে আপনি Gson এর সাথে Enum টাইপের ডেটা কাস্টমাইজ করে JSON এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...