Skill

Date এবং Time Object হ্যান্ডল করা

জিসন (Gson) - Java Technologies

385

Gson ব্যবহার করে Date এবং Time অবজেক্ট হ্যান্ডল করা সাধারণত কিছু বিশেষ কাস্টম Serialization এবং Deserialization মেথড ব্যবহার করে করা হয়। কারণ, Gson ডিফল্টভাবে Date টাইপকে JSON এ কনভার্ট করতে পারে না বা JSON থেকে Date টাইপে ডেসিরিয়ালাইজ করতে পারে না। তবে আপনি সহজেই কাস্টম কনভার্টার তৈরি করে এটি সমাধান করতে পারেন।

1. Date Object কনভার্ট করা (Serialization)

Gson দিয়ে Date অবজেক্ট JSON এ কনভার্ট করার জন্য, আপনি কাস্টম JsonSerializer ব্যবহার করতে পারেন।

উদাহরণ:

ধরা যাক, আপনি একটি Person ক্লাসের মধ্যে একটি Date অবজেক্ট রাখছেন এবং এটি JSON এ কনভার্ট করতে চান।

Person ক্লাস:

import java.util.Date;

public class Person {
    private String name;
    private Date birthDate;

    // Constructor, getters and setters
    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}

কাস্টম JsonSerializer তৈরি করা (Date to JSON):

import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateSerializer implements JsonSerializer<Date> {
    @Override
    public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); // অথবা আপনার পছন্দমত ফরম্যাট
        return context.serialize(sdf.format(date));
    }
}

GsonBuilder ব্যবহার করে কাস্টম Serializer রেজিস্টার করা:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        // Person অবজেক্ট তৈরি করা
        Person person = new Person("John Doe", new Date());

        // GsonBuilder দিয়ে কাস্টম Serializer রেজিস্টার করা
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Date.class, new DateSerializer());
        Gson gson = gsonBuilder.create();

        // Person অবজেক্ট JSON এ কনভার্ট করা
        String json = gson.toJson(person);

        // JSON আউটপুট প্রিন্ট করা
        System.out.println(json);
    }
}

আউটপুট (উদাহরণ):

{
  "name": "John Doe",
  "birthDate": "2024-12-19T14:32:15+0000"
}

2. Date Object ডেসিরিয়ালাইজ করা (JSON to Date)

যেহেতু JSON এ Date ফরম্যাটে স্ট্রিং থাকে, তাই আপনাকে কাস্টম JsonDeserializer তৈরি করতে হবে, যাতে JSON স্ট্রিংটি আবার Date অবজেক্টে রূপান্তরিত হয়।

কাস্টম JsonDeserializer তৈরি করা (JSON to Date):

import com.google.gson.JsonElement;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
        String dateString = json.getAsString();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        try {
            return sdf.parse(dateString);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

GsonBuilder দিয়ে কাস্টম Deserializer রেজিস্টার করা:

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

public class Main {
    public static void main(String[] args) {
        // JSON স্ট্রিং তৈরি করা
        String json = "{\"name\":\"John Doe\",\"birthDate\":\"2024-12-19T14:32:15+0000\"}";

        // GsonBuilder দিয়ে কাস্টম Deserializer রেজিস্টার করা
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
        Gson gson = gsonBuilder.create();

        // JSON কে Person অবজেক্টে কনভার্ট করা
        Person person = gson.fromJson(json, Person.class);

        // Person অবজেক্ট প্রিন্ট করা
        System.out.println(person.getName());
        System.out.println(person.getBirthDate());
    }
}

আউটপুট:

John Doe
Wed Dec 19 14:32:15 GMT 2024

3. Time Object হ্যান্ডলিং (LocalDate, LocalTime, LocalDateTime)

Java 8 এর পরে LocalDate, LocalTime, এবং LocalDateTime টাইপগুলোও Date এর বদলে ব্যবহার করা হচ্ছে। Gson দিয়ে এগুলোকেও কাস্টম JsonSerializer এবং JsonDeserializer ব্যবহার করে হ্যান্ডল করা যায়।

উদাহরণ (LocalDate):

import java.time.LocalDate;

public class Person {
    private String name;
    private LocalDate birthDate;

    // Constructor, getters and setters
    public Person(String name, LocalDate birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }
}

কাস্টম Serializer for LocalDate:

import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateSerializer implements JsonSerializer<LocalDate> {
    @Override
    public JsonElement serialize(LocalDate localDate, Type typeOfSrc, JsonSerializationContext context) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return context.serialize(localDate.format(formatter));
    }
}

কাস্টম Deserializer for LocalDate:

import com.google.gson.JsonElement;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateDeserializer implements JsonDeserializer<LocalDate> {
    @Override
    public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(json.getAsString(), formatter);
    }
}

4. Final Gson Configuration

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

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John Doe", LocalDate.now());

        // GsonBuilder দিয়ে Serializer এবং Deserializer রেজিস্টার করা
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(LocalDate.class, new LocalDateSerializer());
        gsonBuilder.registerTypeAdapter(LocalDate.class, new LocalDateDeserializer());
        Gson gson = gsonBuilder.create();

        // Person অবজেক্ট JSON এ কনভার্ট করা
        String json = gson.toJson(person);
        System.out.println(json);

        // JSON থেকে Person অবজেক্ট ডেসিরিয়ালাইজ করা
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println(deserializedPerson.getName());
        System.out.println(deserializedPerson.getBirthDate());
    }
}
  • Date, LocalDate, LocalTime, এবং LocalDateTime টাইলগুলোকে JSON এ কনভার্ট করার জন্য, আপনাকে কাস্টম JsonSerializer এবং JsonDeserializer ব্যবহার করতে হবে।
  • Gson দিয়ে আপনি খুব সহজেই Date এবং Time টাইপকে হ্যান্ডল করতে পারেন এবং এটি আপনার প্রয়োজন অনুযায়ী কাস্টমাইজ করতে পারেন।
Content added By

Gson-এ Date এবং Time অবজেক্টের Serialization এবং Deserialization প্রক্রিয়া কাস্টমাইজ করা যেতে পারে। Gson স্বাভাবিকভাবে Date টাইপ অবজেক্টগুলো JSON এ timestamp (milliseconds since epoch) ফরম্যাটে রূপান্তর করে, কিন্তু আপনি চাইলে কাস্টম Date ফরম্যাট (যেমন yyyy-MM-dd HH:mm:ss) ব্যবহার করতে পারেন।

এখানে আমরা Gson-এর মাধ্যমে Date এবং Time অবজেক্টের কাস্টম Serialization এবং Deserialization করার পদ্ধতি দেখব।

1. Date Object Serialization এবং Deserialization

1.1 Gson Default Behavior (Date as Timestamp)

Gson ডিফল্টভাবে Date অবজেক্টগুলোকে milliseconds since epoch হিসেবে Serialize এবং Deserialize করে।

উদাহরণ:

import com.google.gson.Gson;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        // একটি Date অবজেক্ট তৈরি করা
        Date now = new Date();

        // Gson দিয়ে Serialize করা
        Gson gson = new Gson();
        String json = gson.toJson(now);
        System.out.println("Serialized Date (Timestamp): " + json);

        // JSON থেকে Date অবজেক্টে Deserialize করা
        Date deserializedDate = gson.fromJson(json, Date.class);
        System.out.println("Deserialized Date: " + deserializedDate);
    }
}

আউটপুট:

Serialized Date (Timestamp): 1639792286464
Deserialized Date: Thu Dec 16 17:58:06 IST 2024

2. Custom Date Format Serialization and Deserialization

আপনি চাইলে একটি নির্দিষ্ট Date ফরম্যাটে (যেমন yyyy-MM-dd HH:mm:ss) Date অবজেক্ট Serialize এবং Deserialize করতে পারেন। এর জন্য Gson-এ SimpleDateFormat ব্যবহার করা হয় এবং কাস্টম Serializer এবং Deserializer তৈরি করা হয়।

2.1 Custom Date Format Serializer এবং Deserializer

import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;

class DateSerializer implements JsonSerializer<Date> {
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(dateFormat.format(date));
    }
}

class DateDeserializer implements JsonDeserializer<Date> {
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return dateFormat.parse(json.getAsString());
        } catch (Exception e) {
            throw new JsonParseException("Invalid date format", e);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // একটি Date অবজেক্ট তৈরি করা
        Date now = new Date();

        // Gson Builder এর মাধ্যমে কাস্টম Serializer এবং Deserializer ব্যবহার করা
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Date.class, new DateSerializer()) // Custom Serializer
                .registerTypeAdapter(Date.class, new DateDeserializer()) // Custom Deserializer
                .create();

        // Serialize করা
        String json = gson.toJson(now);
        System.out.println("Serialized Date with custom format: " + json);

        // Deserialize করা
        Date deserializedDate = gson.fromJson(json, Date.class);
        System.out.println("Deserialized Date: " + deserializedDate);
    }
}

আউটপুট:

Serialized Date with custom format: "2024-12-19 14:34:45"
Deserialized Date: Thu Dec 19 14:34:45 IST 2024

3. Date Format এবং Time Zone কাস্টমাইজেশন

আপনি চাইলে SimpleDateFormat এর সাথে Time Zone এবং Locale সেটও করতে পারেন। এর ফলে Date ফরম্যাটটি নির্দিষ্ট টাইমজোনের ভিত্তিতে কনভার্ট হবে।

import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // Time Zone সেট করা
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

        String formattedDate = sdf.format(now);
        System.out.println("Formatted Date (GMT): " + formattedDate);
    }
}

4. LocalDate, LocalTime এবং LocalDateTime Serialization এবং Deserialization

Java 8 থেকে java.time প্যাকেজে LocalDate, LocalTime, এবং LocalDateTime টাইপগুলো পরিচিত। Gson এই টাইপগুলোকে ডিফল্টভাবে সাপোর্ট করে না, তবে আপনি কাস্টম Serializer এবং Deserializer ব্যবহার করে এগুলোর Serialization এবং Deserialization করতে পারেন।

4.1 Example for LocalDate and LocalDateTime

import com.google.gson.*;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class LocalDateSerializer implements JsonSerializer<LocalDate> {
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Override
    public JsonElement serialize(LocalDate localDate, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(localDate.format(formatter));
    }
}

class LocalDateTimeSerializer implements JsonSerializer<LocalDateTime> {
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public JsonElement serialize(LocalDateTime localDateTime, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(localDateTime.format(formatter));
    }
}

public class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(LocalDate.class, new LocalDateSerializer())
                .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer())
                .create();

        // Serialize LocalDate and LocalDateTime
        String jsonDate = gson.toJson(localDate);
        String jsonDateTime = gson.toJson(localDateTime);

        System.out.println("Serialized LocalDate: " + jsonDate);
        System.out.println("Serialized LocalDateTime: " + jsonDateTime);
    }
}

আউটপুট:

Serialized LocalDate: "2024-12-19"
Serialized LocalDateTime: "2024-12-19 14:35:45"

সারাংশ

  • Date Serialization এবং Deserialization: Gson ডিফল্টভাবে Date অবজেক্টকে timestamp (milliseconds) হিসেবে Serialize করে, তবে আপনি চাইলে কাস্টম ফরম্যাট ব্যবহার করে তার DateSerializer এবং DateDeserializer তৈরি করতে পারেন।
  • Java 8 Date and Time API (LocalDate, LocalDateTime): Gson এই টাইপগুলো সাপোর্ট করে না, তবে কাস্টম Serializer/Deserializer তৈরি করে এগুলোর জন্য কাস্টম Serialization এবং Deserialization করা সম্ভব।
  • Time Zone কাস্টমাইজেশন: SimpleDateFormat ব্যবহার করে আপনি টাইমজোন কাস্টমাইজ করতে পারেন।

এভাবে আপনি Gson-এ Date এবং Time অবজেক্টের Serialization এবং Deserialization কাস্টমাইজ করতে পারেন।

Content added By

Gson লাইব্রেরি ব্যবহার করে আপনি Date বা Time টাইপের মানের জন্য কাস্টম Date Format সেট করতে পারেন। Gson ডিফল্টভাবে ISO 8601 ফরম্যাটে Date সেভ এবং প্যার্স করে, তবে কখনও কখনও আপনি যদি নির্দিষ্ট কাস্টম ফরম্যাট ব্যবহার করতে চান, তখন GsonBuilder এর setDateFormat() বা registerTypeAdapter() পদ্ধতি ব্যবহার করতে পারেন।

এখানে Date টাইপের জন্য কাস্টম ফরম্যাট সেট করার বিভিন্ন পদ্ধতি দেখানো হলো।


১. GsonBuilder এর মাধ্যমে কাস্টম Date Format সেট করা**

আপনি GsonBuilder এর setDateFormat() পদ্ধতি ব্যবহার করে একটি কাস্টম Date ফরম্যাট সেট করতে পারেন। এটি SimpleDateFormat ব্যবহার করে নির্দিষ্ট ফরম্যাটে Date-কে সিরিয়ালাইজ এবং ডিসেরিয়ালাইজ করতে সাহায্য করবে।

উদাহরণ ১: GsonBuilder.setDateFormat() ব্যবহার করা

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", new Date());

        Gson gson = new GsonBuilder()
                        .setDateFormat("yyyy-MM-dd HH:mm:ss")  // Set custom date format
                        .create();

        String json = gson.toJson(person);
        System.out.println(json);  // Output: {"name":"John","birthDate":"2024-12-19 15:30:00"}
    }
}

class Person {
    String name;
    Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}

এখানে, "yyyy-MM-dd HH:mm:ss" ফরম্যাটে birthDate-কে JSON এ সিরিয়ালাইজ করা হয়েছে।

setDateFormat() পদ্ধতি Gson-এ যেকোনো Date টাইপের ফিল্ডের জন্য ডিফল্ট ফরম্যাট হিসেবে কাজ করবে।


২. Custom Date Serializer এবং Deserializer ব্যবহার করা

যদি আপনি আরও কাস্টমাইজড ফরম্যাট চান, তাহলে TypeAdapter বা JsonSerializerJsonDeserializer ব্যবহার করতে পারেন। এতে আপনি কাস্টম সিরিয়ালাইজার এবং ডেসেরিয়ালাইজার তৈরি করতে পারবেন।

উদাহরণ ২: Custom Date Serializer এবং Deserializer

import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", new Date());

        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Date.class, new CustomDateSerializer())  // Register custom serializer
                        .registerTypeAdapter(Date.class, new CustomDateDeserializer())  // Register custom deserializer
                        .create();

        String json = gson.toJson(person);
        System.out.println(json);  // Output: {"name":"John","birthDate":"19-Dec-2024"}
        
        // Deserialize from custom format
        String jsonInput = "{\"name\":\"John\", \"birthDate\":\"19-Dec-2024\"}";
        Person deserializedPerson = gson.fromJson(jsonInput, Person.class);
        System.out.println(deserializedPerson.birthDate);  // Output: Fri Dec 19 00:00:00 UTC 2024
    }
}

class Person {
    String name;
    Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}

// Custom Date Serializer
class CustomDateSerializer implements JsonSerializer<Date> {
    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
        return new JsonPrimitive(sdf.format(src));
    }
}

// Custom Date Deserializer
class CustomDateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        String dateStr = json.getAsString();
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
        try {
            return sdf.parse(dateStr);
        } catch (Exception e) {
            throw new JsonParseException("Unable to parse date: " + dateStr, e);
        }
    }
}

এই উদাহরণে:

  1. CustomDateSerializer সিরিয়ালাইজেশন প্রক্রিয়ায় Date-কে "dd-MMM-yyyy" ফরম্যাটে কনভার্ট করে।
  2. CustomDateDeserializer ডেসেরিয়ালাইজেশন প্রক্রিয়ায় "dd-MMM-yyyy" ফরম্যাটে JSON থেকে Date অবজেক্টে কনভার্ট করে।

৩. Custom Date Format-এ Timezone ব্যবহার করা

কখনো কখনো আপনি যদি Timezone এর জন্য কাস্টম ফরম্যাট চান, তাহলে SimpleDateFormat এ টাইমজোনও সেট করতে পারেন।

উদাহরণ ৩: Date Format সহ Timezone

import com.google.gson.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", new Date());

        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Date.class, new CustomDateWithTimezoneSerializer())  // Register custom serializer
                        .create();

        String json = gson.toJson(person);
        System.out.println(json);  // Output: {"name":"John","birthDate":"2024-12-19 15:30:00 UTC"}
    }
}

class Person {
    String name;
    Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}

// Custom Date Serializer with TimeZone
class CustomDateWithTimezoneSerializer implements JsonSerializer<Date> {
    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));  // Set UTC Timezone
        return new JsonPrimitive(sdf.format(src));
    }
}

এখানে, UTC Timezone ব্যবহার করা হয়েছে, এবং "yyyy-MM-dd HH:mm:ss z" ফরম্যাটে Date সিরিয়ালাইজ করা হয়েছে।


Gson-এ Date টাইপের জন্য কাস্টম ফরম্যাট সেট করার বিভিন্ন পদ্ধতি রয়েছে:

  1. GsonBuilder.setDateFormat() ব্যবহার করে সহজেই কাস্টম ফরম্যাট সেট করা যায়।
  2. Custom Serializer এবং Deserializer ব্যবহার করে আরও কাস্টমাইজড ফরম্যাটে Date টাইপ হ্যান্ডল করা যায়।
  3. আপনি Timezone সহ ফরম্যাট সেট করতে চান, তাও সম্ভব।

এটি JSON ডেটা সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করার সময় খুবই কার্যকরী এবং নমনীয়ভাবে কাজ করতে সাহায্য করে।

Content added By

Gson লাইব্রেরি দিয়ে LocalDate এবং LocalDateTime (Java 8 থেকে সাপোর্ট করা টাইপ) কে JSON-এ কনভার্ট বা JSON থেকে Java অবজেক্টে রূপান্তর করার জন্য কাস্টম Adapter ব্যবহার করতে হয়। কারণ Gson ডিফল্টভাবে LocalDate বা LocalDateTime টাইপ বুঝতে পারে না।

এখানে, আমরা LocalDate এবং LocalDateTime এর জন্য কাস্টম TypeAdapter তৈরি করে Gson এ ব্যবহার করব।

LocalDate এবং LocalDateTime-এর জন্য Gson Adapter তৈরি করা

1. LocalDate Adapter:

LocalDate একটি শুধুমাত্র তারিখ ধারণ করে (যেমন yyyy-MM-dd), তাই এই ধরনের তারিখকে JSON-এ কনভার্ট করার জন্য কাস্টম TypeAdapter তৈরি করতে হবে।

import com.google.gson.*;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class LocalDateAdapter implements JsonSerializer<LocalDate>, JsonDeserializer<LocalDate> {
    private final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;

    @Override
    public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.format(formatter)); // LocalDate কে String-এ রূপান্তর
    }

    @Override
    public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return LocalDate.parse(json.getAsString(), formatter); // String থেকে LocalDate-এ রূপান্তর
    }
}

2. LocalDateTime Adapter:

LocalDateTime একটি তারিখ ও সময় সংক্রান্ত ক্লাস, যেটি yyyy-MM-ddTHH:mm:ss ফরম্যাটে থাকে। এই জন্যও কাস্টম Adapter তৈরি করতে হবে।

import com.google.gson.*;
import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class LocalDateTimeAdapter implements JsonSerializer<LocalDateTime>, JsonDeserializer<LocalDateTime> {
    private final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    @Override
    public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.format(formatter)); // LocalDateTime কে String-এ রূপান্তর
    }

    @Override
    public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return LocalDateTime.parse(json.getAsString(), formatter); // String থেকে LocalDateTime-এ রূপান্তর
    }
}

3. Gson-এ Adapter রেজিস্টার করা:

এখন আমরা এই দুটি কাস্টম Adapter ব্যবহার করে Gson অবজেক্ট তৈরি করব এবং এই LocalDate এবং LocalDateTime টাইপকে সঠিকভাবে JSON-এ কনভার্ট এবং JSON থেকে Java অবজেক্টে রূপান্তর করব।

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;

class Person {
    String name;
    LocalDate birthDate;
    LocalDateTime lastLogin;

    public Person(String name, LocalDate birthDate, LocalDateTime lastLogin) {
        this.name = name;
        this.birthDate = birthDate;
        this.lastLogin = lastLogin;
    }
}

public class Main {
    public static void main(String[] args) {
        // GsonBuilder দিয়ে Gson তৈরি
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // LocalDate Adapter
                        .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter()) // LocalDateTime Adapter
                        .create();

        // Person অবজেক্ট তৈরি
        Person person = new Person("John", LocalDate.of(1990, 5, 15), LocalDateTime.now());

        // Person অবজেক্টকে JSON-এ রূপান্তর
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // JSON থেকে Person অবজেক্টে রূপান্তর
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson.name + ", " 
                           + deserializedPerson.birthDate + ", " + deserializedPerson.lastLogin);
    }
}

বিস্তারিত ব্যাখ্যা:

  1. LocalDateAdapter এবং LocalDateTimeAdapter: এই ক্লাস দুটি কাস্টম Gson TypeAdapter যা LocalDate এবং LocalDateTime টাইপকে JSON-এ কনভার্ট এবং JSON থেকে Java অবজেক্টে রূপান্তর করার জন্য ব্যবহৃত হয়।
    • serialize() মেথড JSON অবজেক্টে রূপান্তর করে।
    • deserialize() মেথড JSON অবজেক্ট থেকে Java অবজেক্টে রূপান্তর করে।
  2. GsonBuilder: GsonBuilder ব্যবহার করে Gson অবজেক্ট তৈরি করা হয়, যেখানে registerTypeAdapter() মেথড ব্যবহার করে কাস্টম TypeAdapter রেজিস্টার করা হয়েছে।
  3. Person অবজেক্ট: Person ক্লাসে LocalDate এবং LocalDateTime টাইপের ফিল্ড রয়েছে, যেগুলো JSON-এ কনভার্ট ও ডেসিরিয়ালাইজ করার জন্য কাস্টম Adapter ব্যবহার করা হয়েছে।

আউটপুট:

Serialized JSON: {"name":"John","birthDate":"1990-05-15","lastLogin":"2024-12-19T16:05:17.939558"}
Deserialized Person: John, 1990-05-15, 2024-12-19T16:05:17.939558

এখানে:

  • birthDate এবং lastLogin এর মান JSON স্ট্রিংয়ে সঠিকভাবে yyyy-MM-dd এবং yyyy-MM-dd'T'HH:mm:ss ফরম্যাটে রূপান্তরিত হয়েছে।
  • JSON থেকে আবার LocalDate এবং LocalDateTime অবজেক্টে রূপান্তর করা হয়েছে।

সংক্ষেপে:

  • Gson দিয়ে LocalDate এবং LocalDateTime টাইপকে JSON-এ কনভার্ট এবং JSON থেকে Java অবজেক্টে রূপান্তর করার জন্য কাস্টম TypeAdapter ব্যবহার করা হয়।
  • এই TypeAdapter গুলো তৈরি করা হয় JsonSerializer এবং JsonDeserializer ইন্টারফেস ব্যবহার করে।
  • GsonBuilder ব্যবহার করে এই কাস্টম Adapter গুলো রেজিস্টার করা হয়।

এভাবে আপনি Gson এর মাধ্যমে LocalDate এবং LocalDateTime টাইপের ডেটা JSON এর সাথে ব্যবহার করতে পারেন।

Content added By

Gson লাইব্রেরি ব্যবহার করে JSON ডেটার মধ্যে কাস্টম ডেট ফরম্যাট কনভার্ট (সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ) করার জন্য আপনি JsonSerializer এবং JsonDeserializer ইন্টারফেস ব্যবহার করতে পারেন। এটি ব্যবহার করে আপনি জটিল বা কাস্টম ডেট ফরম্যাট যেমন yyyy-MM-dd HH:mm:ss বা অন্য যেকোনো ফরম্যাটে ডেটা কনভার্ট করতে পারবেন।

উদাহরণ:

ধরা যাক, আমাদের একটি Date ফিল্ড রয়েছে, এবং আমরা চাই সেটি কাস্টম ফরম্যাটে JSON এ সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ হোক।

1. ডেট টাইপে কাস্টম ফরম্যাট (JsonSerializer এবং JsonDeserializer ব্যবহার করে)

Maven ডিপেনডেন্সি:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

কাস্টম ডেট ফরম্যাটের জন্য উদাহরণ:

import com.google.gson.*;
import com.google.gson.annotations.SerializedName;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

class Person {
    private String name;

    @SerializedName("birth_date")
    private Date birthDate;

    // Constructor
    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }

    // Getter and Setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

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

class DateSerializer implements JsonSerializer<Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(dateFormat.format(date));  // Convert Date to custom string format
    }
}

class DateDeserializer implements JsonDeserializer<Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return dateFormat.parse(json.getAsString());  // Convert string to Date using custom format
        } catch (ParseException e) {
            throw new JsonParseException("Invalid date format", e);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // Person object with a Date
        Person person = new Person("John", new Date());

        // Gson with custom serializer and deserializer for Date
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Date.class, new DateSerializer())
                        .registerTypeAdapter(Date.class, new DateDeserializer())
                        .create();

        // Serialize the Person object to JSON
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // Deserialize back to a Person object
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson);
    }
}

ব্যাখ্যা:

  1. DateSerializer এবং DateDeserializer: এই দুটি ক্লাসে আমরা কাস্টম ডেট ফরম্যাটের জন্য SimpleDateFormat ব্যবহার করেছি। DateSerializer ডেটাকে নির্দিষ্ট ফরম্যাটে স্ট্রিং হিসেবে কনভার্ট করে এবং DateDeserializer সেই কাস্টম ফরম্যাট স্ট্রিং থেকে Date অবজেক্টে কনভার্ট করে।
  2. GsonBuilder: GsonBuilder ব্যবহার করে আমরা registerTypeAdapter মেথডের মাধ্যমে কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার যুক্ত করেছি। এটি নিশ্চিত করে যে, যখন Date টাইপের ডেটা JSON এ সিরিয়ালাইজ বা ডেসিরিয়ালাইজ হয়, তখন কাস্টম ফরম্যাটটি ব্যবহার হবে।

আউটপুট:

Serialized JSON (সিরিয়ালাইজড JSON):

{"name":"John","birth_date":"2024-12-19 12:45:00"}

Deserialized Person (ডেসিরিয়ালাইজড অবজেক্ট):

Person{name='John', birthDate=Wed Dec 19 12:45:00 GMT 2024}

2. অন্য কাস্টম ডেট ফরম্যাট:

ধরা যাক আপনি yyyy/MM/dd ফরম্যাট ব্যবহার করতে চান। কেবলমাত্র SimpleDateFormat এর ফরম্যাট পরিবর্তন করুন:

private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

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

3. কাস্টম টাইমজোন (TimeZone) ব্যবহার করা:

যদি আপনি টাইমজোনের সাথে কাজ করতে চান, তাহলে SimpleDateFormat এর সাথে setTimeZone মেথড ব্যবহার করতে পারেন:

dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

সারাংশ:

  • Gson লাইব্রেরির মাধ্যমে আপনি কাস্টম ডেট ফরম্যাট ব্যবহার করতে পারেন ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে।
  • কাস্টম সিরিয়ালাইজার এবং ডেসিরিয়ালাইজার তৈরি করে আপনি যে কোনো কাস্টম ডেট ফরম্যাট পরিচালনা করতে পারবেন।
  • SimpleDateFormat ব্যবহার করে কাস্টম ডেট ফরম্যাট এবং টাইমজোনে ডেটা প্রক্রিয়া করা সম্ভব।
Content added By
Promotion

Are you sure to start over?

Loading...