Complex Date Formats হ্যান্ডল করা

Date এবং Time হ্যান্ডল করা - জ্যাকসন (Jackson) - Java Technologies

321

জ্যাকসন (Jackson) ব্যবহার করে কমপ্লেক্স ডেট ফরম্যাট হ্যান্ডল করা খুব সহজ, কারণ এটি ডেট ফরম্যাটিং এবং কাস্টমাইজেশনের জন্য বিভিন্ন বিল্ট-ইন এবং কাস্টম পদ্ধতি প্রদান করে।

নিচে বিভিন্ন পদ্ধতি এবং উদাহরণ দিয়ে বিষয়টি ব্যাখ্যা করা হলো:


1. Default Date Handling

জ্যাকসন ডিফল্টভাবে java.util.Date এবং অন্যান্য ডেট টাইপকে ISO-8601 ফরম্যাটে (যেমন, yyyy-MM-dd'T'HH:mm:ss.SSSZ) Serialize এবং Deserialize করে।

উদাহরণ: Default Date Handling

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;

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

        // Date Serialization
        Date currentDate = new Date();
        String json = mapper.writeValueAsString(currentDate);
        System.out.println("Serialized Date: " + json);

        // Date Deserialization
        Date deserializedDate = mapper.readValue(json, Date.class);
        System.out.println("Deserialized Date: " + deserializedDate);
    }
}

আউটপুট:

"2024-12-21T09:30:45.123+0000"

2. Custom Date Formats

@JsonFormat Annotation ব্যবহার করে

@JsonFormat অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ডেট ফরম্যাট নির্ধারণ করা যায়।

উদাহরণ: Custom Date Format

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;

class Event {
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
    private Date eventDate;

    // Constructors, Getters, and Setters
    public Event() {}

    public Event(String name, Date eventDate) {
        this.name = name;
        this.eventDate = eventDate;
    }

    @Override
    public String toString() {
        return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
    }
}

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

        Event event = new Event("Conference", new Date());
        
        // Serialize
        String json = mapper.writeValueAsString(event);
        System.out.println("Serialized JSON: " + json);

        // Deserialize
        String eventJson = "{\"name\":\"Conference\",\"eventDate\":\"21-12-2024 15:30:00\"}";
        Event deserializedEvent = mapper.readValue(eventJson, Event.class);
        System.out.println("Deserialized Object: " + deserializedEvent);
    }
}

আউটপুট:

Serialized JSON: {"name":"Conference","eventDate":"21-12-2024 15:30:00"}
Deserialized Object: Event{name='Conference', eventDate=Sat Dec 21 15:30:00 GMT 2024}

Global Date Format সেট করা

ObjectMapper-এর মাধ্যমে পুরো অ্যাপ্লিকেশনে ডেট ফরম্যাট নির্ধারণ করা যায়।

উদাহরণ: Global Date Format

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;

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

        // Global date format
        mapper.setDateFormat(new StdDateFormat());
        
        Date currentDate = new Date();

        // Serialize
        String json = mapper.writeValueAsString(currentDate);
        System.out.println("Serialized JSON: " + json);

        // Deserialize
        Date deserializedDate = mapper.readValue(json, Date.class);
        System.out.println("Deserialized Date: " + deserializedDate);
    }
}

3. Custom Serializer এবং Deserializer

কাস্টম লজিক প্রয়োগ করে ডেট ফরম্যাট হ্যান্ডল করা যায়।

উদাহরণ: Custom Serializer

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

class CustomDateSerializer extends JsonSerializer<Date> {
    private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

    @Override
    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(formatter.format(date));
    }
}

class EventCustom {
    private String name;

    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = CustomDateSerializer.class)
    private Date eventDate;

    // Constructors, Getters, and Setters
    public EventCustom(String name, Date eventDate) {
        this.name = name;
        this.eventDate = eventDate;
    }
}

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

        EventCustom event = new EventCustom("Seminar", new Date());
        String json = mapper.writeValueAsString(event);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

{"name":"Seminar","eventDate":"21/12/2024 15:45:00"}

উদাহরণ: Custom Deserializer

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

class CustomDateDeserializer extends JsonDeserializer<Date> {
    private static final SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String date = p.getText();
        try {
            return formatter.parse(date);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

class EventCustomDeserialization {
    private String name;

    @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CustomDateDeserializer.class)
    private Date eventDate;

    // Getters, Setters, and toString
    public EventCustomDeserialization() {}
    public EventCustomDeserialization(String name, Date eventDate) {
        this.name = name;
        this.eventDate = eventDate;
    }

    @Override
    public String toString() {
        return "Event{name='" + name + '\'' + ", eventDate=" + eventDate + '}';
    }
}

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

        String json = "{\"name\":\"Workshop\",\"eventDate\":\"21/12/2024\"}";
        EventCustomDeserialization event = mapper.readValue(json, EventCustomDeserialization.class);
        System.out.println("Deserialized Object: " + event);
    }
}

আউটপুট:

Deserialized Object: Event{name='Workshop', eventDate=Sat Dec 21 00:00:00 GMT 2024}

4. টিপস

  1. ডিফল্ট ফরম্যাট: ISO-8601 ফরম্যাট ব্যবহার করতে হলে কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই।
  2. কাস্টম ফরম্যাট: অ্যাপ্লিকেশনের প্রয়োজন অনুযায়ী @JsonFormat বা কাস্টম Serializer/Deserializer ব্যবহার করুন।
  3. Time Zones: সময় অঞ্চলের পার্থক্য থাকলে java.time প্যাকেজ (যেমন LocalDateTime, ZonedDateTime) ব্যবহার করা ভালো।
Content added By
Promotion

Are you sure to start over?

Loading...