@JsonDeserialize এবং @JsonSerialize গাইড ও নোট

Java Technologies - জ্যাকসন অ্যানোটেশন (Jackson Annotations)
318

@JsonDeserialize এবং @JsonSerialize Jackson অ্যানোটেশন দুটি খুবই গুরুত্বপূর্ণ, যা custom serialization এবং deserialization কাস্টমাইজ করতে ব্যবহৃত হয়। এই অ্যানোটেশনগুলো আপনাকে JSON ডেটা প্রক্রিয়াকরণের সময় কাস্টম লজিক প্রয়োগ করতে সহায়তা করে।

  • @JsonSerialize: Custom Serialization-এর জন্য ব্যবহৃত হয়। JSON-এ যেভাবে ডেটা সিরিয়ালাইজ হবে তা কাস্টমাইজ করতে।
  • @JsonDeserialize: Custom Deserialization-এর জন্য ব্যবহৃত হয়। JSON থেকে যেভাবে ডেটা ডেসিরিয়ালাইজ হবে তা কাস্টমাইজ করতে।

এগুলো ব্যবহৃত হয় যখন আপনার ক্লাস বা ফিল্ডের জন্য ডিফল্ট Serialization/Deserialization আচরণ যথাযথ নয় বা আপনি বিশেষ কোনো লজিক প্রয়োগ করতে চান।


@JsonSerialize

@JsonSerialize অ্যানোটেশন ব্যবহার করে আপনি একটি ক্লাস বা ফিল্ডের জন্য কাস্টম Serializer নির্ধারণ করতে পারেন। এটি আপনার JSON ফিল্ডের কাস্টম আউটপুট তৈরি করতে সহায়তা করে।

ব্যবহার:

import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
    private String name;
    private Date createdAt;

    // Constructor, Getters, Setters
    public User(String name, Date createdAt) {
        this.name = name;
        this.createdAt = createdAt;
    }

    public String getName() {
        return name;
    }

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

    public Date getCreatedAt() {
        return createdAt;
    }

    @JsonSerialize(using = CustomDateSerializer.class)
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
}

class CustomDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, com.fasterxml.jackson.core.JsonGenerator gen, com.fasterxml.jackson.databind.SerializerProvider serializers) throws IOException {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        String formattedDate = formatter.format(value);
        gen.writeString(formattedDate);
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonSerializeExample {
    public static void main(String[] args) throws Exception {
        User user = new User("Rahim", new Date());

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "Rahim",
  "createdAt": "21-12-2024"
}

Explanation:

  • @JsonSerialize(using = CustomDateSerializer.class): এখানে createdAt ফিল্ডের জন্য আমরা একটি কাস্টম Date Serializer ব্যবহার করেছি, যা তারিখকে dd-MM-yyyy ফরম্যাটে সিরিয়ালাইজ করবে।

@JsonDeserialize

@JsonDeserialize অ্যানোটেশন ব্যবহার করে আপনি একটি ক্লাস বা ফিল্ডের জন্য কাস্টম Deserializer নির্ধারণ করতে পারেন। এটি JSON থেকে Java Object-এ রূপান্তরের সময় কাস্টম লজিক প্রয়োগ করতে ব্যবহৃত হয়।

ব্যবহার:

import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
    private String name;
    private Date createdAt;

    // Constructor, Getters, Setters
    public User(String name, Date createdAt) {
        this.name = name;
        this.createdAt = createdAt;
    }

    public String getName() {
        return name;
    }

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

    public Date getCreatedAt() {
        return createdAt;
    }

    @JsonDeserialize(using = CustomDateDeserializer.class)
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
}

class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt) throws IOException {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        String date = p.getText();
        try {
            return formatter.parse(date);
        } catch (Exception e) {
            throw new IOException("Invalid date format");
        }
    }
}

Deserialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonDeserializeExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Rahim\",\"createdAt\":\"21-12-2024\"}";

        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);

        System.out.println(user.getName());
        System.out.println(user.getCreatedAt());
    }
}
Output:
Rahim
Fri Dec 21 00:00:00 IST 2024

Explanation:

  • @JsonDeserialize(using = CustomDateDeserializer.class): এখানে createdAt ফিল্ডের জন্য একটি কাস্টম Date Deserializer ব্যবহার করা হয়েছে, যা JSON থেকে তারিখের স্ট্রিংটিকে dd-MM-yyyy ফরম্যাটে Date অবজেক্টে রূপান্তর করবে।

@JsonSerialize এবং @JsonDeserialize একত্রে ব্যবহার

কোনো ক্ষেত্র বা ক্লাসে আপনি @JsonSerialize এবং @JsonDeserialize একত্রে ব্যবহার করতে পারেন, যাতে Custom Serialization এবং Custom Deserialization উভয়ই কাস্টমাইজ করা যায়।

উদাহরণ:

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

public class Product {
    private String name;
    private Double price;

    @JsonSerialize(using = CustomPriceSerializer.class)
    @JsonDeserialize(using = CustomPriceDeserializer.class)
    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

class CustomPriceSerializer extends JsonSerializer<Double> {
    @Override
    public void serialize(Double value, com.fasterxml.jackson.core.JsonGenerator gen, com.fasterxml.jackson.databind.SerializerProvider serializers) throws IOException {
        gen.writeString("$" + String.format("%.2f", value));  // Adding '$' and formatting price
    }
}

class CustomPriceDeserializer extends JsonDeserializer<Double> {
    @Override
    public Double deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt) throws IOException {
        String value = p.getText();
        return Double.parseDouble(value.replace("$", ""));  // Remove '$' and convert to Double
    }
}

Serialization and Deserialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonSerializeDeserializeExample {
    public static void main(String[] args) throws Exception {
        Product product = new Product();
        product.setName("Laptop");
        product.setPrice(999.99);

        ObjectMapper mapper = new ObjectMapper();

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

        // Deserialization
        Product deserializedProduct = mapper.readValue(json, Product.class);
        System.out.println("Deserialized Product Price: " + deserializedProduct.getPrice());
    }
}
Output:
Serialized JSON: {"name":"Laptop","price":"$999.99"}
Deserialized Product Price: 999.99

Summary of @JsonSerialize and @JsonDeserialize Usage

AnnotationPurposeWhere to Use
@JsonSerializeTo customize how an object is serialized to JSON.Applied on field or getter method.
@JsonDeserializeTo customize how JSON is deserialized into an object.Applied on field or setter method.
Use togetherTo customize both serialization and deserialization.Applied together on fields or methods.

  • @JsonSerialize এবং @JsonDeserialize Jackson অ্যানোটেশন দুটি JSON Serialization এবং Deserialization কাস্টমাইজ করতে ব্যবহৃত হয়।
  • এগুলি আপনাকে Custom Serialization এবং Custom Deserialization প্রয়োগ করতে সাহায্য করে, যা সাধারণত ডেটার ফরম্যাটিং এবং কাস্টম লজিক প্রয়োগের জন্য প্রয়োজনীয় হয়।
  • এটি বিশেষত complex types, date/time formatting, currency বা অন্যান্য custom formats-এ দরকারি হতে পারে।
Content added By

@JsonDeserialize এবং @JsonSerialize এর ধারণা

319

Jackson এর @JsonDeserialize এবং @JsonSerialize অ্যানোটেশনগুলি Custom Serialization এবং Custom Deserialization এর জন্য ব্যবহৃত হয়। যখন আপনি কোনো কাস্টম লজিক বা বিশেষ ফরম্যাটের জন্য JSON Serialization বা Deserialization করতে চান, তখন এই অ্যানোটেশনগুলি ব্যবহার করা হয়।


@JsonSerialize Annotation

  • @JsonSerialize অ্যানোটেশনটি Jackson-এর মাধ্যমে একটি Java Object থেকে JSON-এ রূপান্তর করার সময় কাস্টম Serializer ব্যবহার করতে ব্যবহৃত হয়।
  • এটি নির্দিষ্ট মেথড বা ক্লাসের জন্য কাস্টম Serialization প্রক্রিয়া নির্ধারণ করতে সাহায্য করে।

ব্যবহার:

  1. Custom Serializer তৈরি করা।
  2. @JsonSerialize ব্যবহার করে সেই Custom Serializer নির্দিষ্ট ফিল্ড বা ক্লাসে প্রয়োগ করা।

@JsonDeserialize Annotation

  • @JsonDeserialize অ্যানোটেশনটি Jackson-এর মাধ্যমে JSON থেকে Java Object-এ রূপান্তর করার সময় কাস্টম Deserializer ব্যবহার করতে ব্যবহৃত হয়।
  • এটি নির্দিষ্ট মেথড বা ক্লাসের জন্য কাস্টম Deserialization প্রক্রিয়া নির্ধারণ করতে সাহায্য করে।

ব্যবহার:

  1. Custom Deserializer তৈরি করা।
  2. @JsonDeserialize ব্যবহার করে সেই Custom Deserializer নির্দিষ্ট ফিল্ড বা ক্লাসে প্রয়োগ করা।

Custom Serializer এবং Deserializer তৈরি করা

১. Custom Serializer Example:

যদি আমাদের একটি Date অবজেক্ট থাকে, এবং আমরা চাই JSON-এ এটি "yyyy-MM-dd" ফরম্যাটে রূপান্তরিত হোক, তবে আমরা একটি কাস্টম Serializer ব্যবহার করতে পারি।

Custom Serializer:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

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

public class CustomDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(value);
        gen.writeString(formattedDate);
    }
}
@JsonSerialize ব্যবহার:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public class Event {
    private String name;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date eventDate;

    // Constructors, Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;

public class JsonSerializeExample {
    public static void main(String[] args) throws Exception {
        Event event = new Event("Meeting", new Date());
        
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(event);

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "Meeting",
  "eventDate": "2024-12-21"
}
  • এখানে, CustomDateSerializer ব্যবহার করে Date ফিল্ডটি "yyyy-MM-dd" ফরম্যাটে JSON-এ রূপান্তরিত হয়েছে।

২. Custom Deserializer Example:

এখন, যদি আমরা JSON-এ একটি তারিখের স্ট্রিং (যেমন: "2024-12-21") গ্রহণ করতে চাই এবং সেটি Date অবজেক্টে রূপান্তর করতে চাই, তাহলে আমরা একটি কাস্টম Deserializer তৈরি করব।

Custom Deserializer:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.DeserializationContext;

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

public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateStr = p.getText();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return sdf.parse(dateStr);
        } catch (Exception e) {
            throw new IOException("Invalid date format");
        }
    }
}
@JsonDeserialize ব্যবহার:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class Event {
    private String name;

    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date eventDate;

    // Constructors, Getters and Setters
}
Deserialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonDeserializeExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Meeting\", \"eventDate\":\"2024-12-21\"}";
        
        ObjectMapper mapper = new ObjectMapper();
        Event event = mapper.readValue(json, Event.class);

        System.out.println("Event Name: " + event.getName());
        System.out.println("Event Date: " + event.getEventDate());
    }
}
Output:
Event Name: Meeting
Event Date: Sun Dec 21 00:00:00 IST 2024
  • এখানে, CustomDateDeserializer ব্যবহার করে JSON তারিখ স্ট্রিংটি Date অবজেক্টে রূপান্তরিত হয়েছে।

@JsonSerialize এবং @JsonDeserialize এর সুবিধা

  1. Custom Serialization এবং Deserialization:
    • আপনি যখন JSON ফরম্যাট কাস্টমাইজ করতে চান (যেমন: তারিখ, সংখ্যা, বা কোনো কাস্টম লজিক), তখন এই অ্যানোটেশন ব্যবহার করতে পারেন।
  2. Complex Types:
    • জটিল ডেটা টাইপের জন্য, যেমন Custom Objects বা Nested Structures, কাস্টম Serialization/Deserialization লজিক প্রয়োগ করতে পারা যায়।
  3. Data Validation:
    • Custom Deserializer ব্যবহার করে ইনপুট ডেটার বৈধতা যাচাই করা যায় এবং যেকোনো ত্রুটি মোকাবেলা করা সম্ভব।
  4. Flexible Data Mapping:
    • ডেটা মডেলগুলোর মধ্যে Mismatch (ফিল্ড নামের অমিল) থাকলে @JsonSerialize এবং @JsonDeserialize ব্যবহার করে সেগুলোর মানচিত্র তৈরির জন্য কাস্টম লজিক প্রয়োগ করা সম্ভব।

@JsonSerialize এবং @JsonDeserialize এর সীমাবদ্ধতা

  1. Complexity:
    • কাস্টম Serializer এবং Deserializer তৈরি করা কিছুটা জটিল হতে পারে, বিশেষত বড় ডেটা মডেল এবং ফিল্ডের জন্য।
  2. Performance Impact:
    • Custom Serialization এবং Deserialization কিছুটা অতিরিক্ত প্রসেসিং করতে পারে, যা পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষত বড় ডেটা সেটের ক্ষেত্রে।
  3. Maintenance:
    • একাধিক কাস্টম Serializer এবং Deserializer ব্যবহারের ফলে কোডের রক্ষণাবেক্ষণ কঠিন হতে পারে, বিশেষত যখন অনেক গুলি Custom Mapping প্রয়োগ করা হয়।

  • @JsonSerialize এবং @JsonDeserialize Jackson-এর শক্তিশালী টুলস যা আপনাকে JSON-এ কাস্টম Serialization এবং Deserialization লজিক প্রয়োগ করতে দেয়।
  • Custom Serializer এবং Deserializer ব্যবহার করে আপনি JSON ডেটা ফরম্যাটিং কাস্টমাইজ করতে পারবেন এবং জটিল ডেটা মডেলগুলোর জন্য কার্যকর Data Mapping তৈরি করতে পারবেন।
Content added By

Custom Deserializer এবং Serializer তৈরি করা

265

Jackson এর মাধ্যমে Custom Serializer এবং Custom Deserializer তৈরি করা খুবই কার্যকর যখন আপনি JSON-এ ডেটা কাস্টম ফরম্যাটে সেভ বা রিড করতে চান। এই প্রক্রিয়া আপনার ডেটা প্রসেসিংয়ের জন্য বেশি নিয়ন্ত্রণ প্রদান করে। Jackson আপনাকে একটি Custom Serializer এবং Custom Deserializer তৈরি করার সুবিধা দেয়, যা আপনার নিজের প্রয়োজন অনুযায়ী JSON ডেটা কাস্টমাইজ করতে সহায়ক।


Custom Serializer

Jackson-এ Custom Serializer তৈরি করার জন্য আপনাকে JsonSerializer<T> ক্লাস ইমপ্লিমেন্ট করতে হবে। এই ক্লাসে, আপনি serialize() মেথডে আপনার কাস্টম লজিক প্রয়োগ করবেন, যা JSON এ রূপান্তর করার সময় কাজ করবে।

Custom Serializer Example

ধরা যাক, আমাদের একটি Product ক্লাস আছে, এবং আমরা তার price ফিল্ডকে কাস্টম ফরম্যাটে JSON এ রাখতে চাই (যেমন: "Price: $123.45" আকারে)।

Step 1: 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 ProductSerializer extends JsonSerializer<Product> {

    @Override
    public void serialize(Product product, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("name", product.getName());
        gen.writeStringField("price", "Price: $" + product.getPrice());
        gen.writeEndObject();
    }
}
Step 2: Product Class এ Custom Serializer যুক্ত করা
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

public class Product {
    private String name;
    private double price;

    // Constructors, Getters, and Setters

    @JsonSerialize(using = ProductSerializer.class)
    public double getPrice() {
        return price;
    }
}
Step 3: Serializer ব্যবহার করে JSON তৈরি করা
import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomSerializerExample {
    public static void main(String[] args) throws Exception {
        Product product = new Product("Laptop", 999.99);

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(product);

        System.out.println(json);
    }
}
Output:
{
  "name": "Laptop",
  "price": "Price: $999.99"
}

এখানে, ProductSerializer ক্লাসটি price ফিল্ডটি কাস্টম ফরম্যাটে JSON এ পরিণত করে।


Custom Deserializer

Custom Deserializer তৈরি করার জন্য, আপনি JsonDeserializer<T> ক্লাস ইমপ্লিমেন্ট করবেন এবং deserialize() মেথডে কাস্টম ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করবেন। এটি JSON থেকে Java Object তৈরি করার জন্য ব্যবহার হয়।

Custom Deserializer Example

ধরা যাক, আমরা একটি Product অবজেক্ট ডেসিরিয়ালাইজ করতে চাই, যেখানে price ফিল্ডটি "Price: $999.99" এর মত স্ট্রিং ফরম্যাটে থাকবে। আমাদের একটি কাস্টম ডেসিরিয়ালাইজার তৈরি করতে হবে যা এই ফরম্যাটে স্ট্রিং নিয়ে সঠিক ডবল ভ্যালুতে রূপান্তর করবে।

Step 1: 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 ProductDeserializer extends JsonDeserializer<Product> {

    @Override
    public Product deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getText();  // JSON থেকে value নেয়া

        // Price string parsing: "Price: $999.99" থেকে "999.99" বের করা
        String priceString = value.replace("Price: $", "");
        double price = Double.parseDouble(priceString);

        // Product object তৈরি এবং price সেট করা
        Product product = new Product();
        product.setPrice(price);
        return product;
    }
}
Step 2: Product Class-এ Custom Deserializer যুক্ত করা
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class Product {
    private String name;
    private double price;

    // Constructors, Getters, and Setters

    @JsonDeserialize(using = ProductDeserializer.class)
    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Step 3: Custom Deserializer ব্যবহার করে JSON থেকে Object তৈরি করা
import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomDeserializerExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Laptop\",\"price\":\"Price: $999.99\"}";

        ObjectMapper objectMapper = new ObjectMapper();
        Product product = objectMapper.readValue(json, Product.class);

        System.out.println("Name: " + product.getName());
        System.out.println("Price: " + product.getPrice());
    }
}
Output:
Name: Laptop
Price: 999.99

এখানে, ProductDeserializer ক্লাসটি price ফিল্ডের কাস্টম ডেসিরিয়ালাইজেশন করতে সাহায্য করেছে, যেখানে "Price: $999.99" স্ট্রিং থেকে মূল মূল্য বের করে ডবল টাইপে রূপান্তর করা হয়েছে।


Custom Serializer এবং Deserializer এর সুবিধা

  1. Complex Data Handling:
    • JSON ডেটা প্রক্রিয়াকরণের সময় জটিল বা কাস্টম লজিক প্রয়োগ করার জন্য উপকারী।
  2. Improved Control:
    • Java Object থেকে JSON এবং JSON থেকে Java Object এ কাস্টম কনভার্সন পরিচালনার জন্য অধিক নিয়ন্ত্রণ প্রদান করে।
  3. Flexibility:
    • JSON ফরম্যাট বা Java অবজেক্টের কাঠামো পরিবর্তন হলেও আপনার কাস্টম লজিকের মাধ্যমে সেগুলো সঠিকভাবে প্রক্রিয়া করা সম্ভব।

  1. Custom Serializer এবং Custom Deserializer Jackson এর মাধ্যমে JSON Serialization এবং Deserialization কাস্টমাইজ করার জন্য খুবই উপকারী।
  2. JsonSerializer<T> এবং JsonDeserializer<T> ক্লাস ব্যবহার করে আপনি সহজেই কাস্টম ফরম্যাট তৈরি করতে পারেন।
  3. Jackson-এর Annotations (যেমন: @JsonSerialize এবং @JsonDeserialize) এর মাধ্যমে আপনি নির্দিষ্ট ফিল্ড বা ক্লাসে কাস্টম Serializer এবং Deserializer প্রয়োগ করতে পারবেন।
Content added By

Complex Object serialization/deserialization এর কৌশল

257

Jackson একটি শক্তিশালী লাইব্রেরি যা Java Objects কে JSON এ রূপান্তর (Serialization) এবং JSON থেকে Java Objects তৈরি (Deserialization) করতে সাহায্য করে। Complex Objects, যেমন nested objects, collections, inheritance hierarchies, এবং bidirectional relationships এর ক্ষেত্রে Jackson অ্যানোটেশন ব্যবহার করে নির্ভুলভাবে Serialization এবং Deserialization করা যায়।

এখানে Jackson অ্যানোটেশন ব্যবহার করে Complex Object Serialization/Deserialization এর কিছু গুরুত্বপূর্ণ কৌশল আলোচনা করা হবে।


1. Nested Objects Serialization/Deserialization

Nested objects সাধারণত একটি object এর মধ্যে আরেকটি object থাকে। Jackson ডিফল্টভাবে এটি handle করতে পারে, তবে কখনও কখনও আপনি এটি কাস্টমাইজ করতে চান।

উদাহরণ:

public class Address {
    private String street;
    private String city;
    private String zipCode;

    // Constructors, Getters, Setters
}

public class User {
    private String name;
    private int age;

    private Address address;  // Nested Object

    // Constructors, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class NestedObjectSerialization {
    public static void main(String[] args) throws Exception {
        Address address = new Address("123 Main St", "Dhaka", "1212");
        User user = new User("Rahim", 30, address);

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }
}
Output:
{
  "name": "Rahim",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Dhaka",
    "zipCode": "1212"
  }
}

2. Using @JsonProperty for Custom Field Naming

@JsonProperty অ্যানোটেশন ব্যবহার করে আপনি Java ফিল্ড এবং JSON ফিল্ডের নামের মধ্যে পার্থক্য রাখতে পারেন।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    @JsonProperty("full_name")
    private String name;

    @JsonProperty("user_age")
    private int age;

    // Constructors, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomFieldNaming {
    public static void main(String[] args) throws Exception {
        User user = new User("Rahim", 30);

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }
}
Output:
{
  "full_name": "Rahim",
  "user_age": 30
}

3. Using @JsonIgnore to Ignore Fields

Jackson এর @JsonIgnore অ্যানোটেশন ব্যবহার করে কিছু ফিল্ড Serialization বা Deserialization থেকে বাদ দেওয়া যায়। এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে আপনি কিছু অবজেক্টের প্রপার্টি JSON-এ অন্তর্ভুক্ত করতে চান না।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonIgnore;

public class User {
    private String name;

    @JsonIgnore
    private int age;

    // Constructors, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class IgnoreFieldExample {
    public static void main(String[] args) throws Exception {
        User user = new User("Rahim", 30);

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }
}
Output:
{
  "name": "Rahim"
}

4. Handling Bidirectional Relationships with @JsonManagedReference and @JsonBackReference

Bidirectional relationships, বিশেষ করে Parent-Child রিলেশনশিপের ক্ষেত্রে Circular References এড়ানোর জন্য @JsonManagedReference এবং @JsonBackReference ব্যবহার করা হয়। এটি infinite recursion থেকে রক্ষা করে।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Parent {
    private String name;

    @JsonManagedReference
    private Child child;

    // Constructors, Getters, Setters
}

public class Child {
    private String name;

    @JsonBackReference
    private Parent parent;

    // Constructors, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class BidirectionalSerialization {
    public static void main(String[] args) throws Exception {
        Parent parent = new Parent("Rahim");
        Child child = new Child("Rita");

        parent.setChild(child);
        child.setParent(parent);

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(parent);

        System.out.println(json);
    }
}
Output:
{
  "name": "Rahim",
  "child": {
    "name": "Rita"
  }
}

ব্যাখ্যা:

  • @JsonManagedReference এবং @JsonBackReference দিয়ে circular reference সমাধান করা হয়েছে, যেখানে child ফিল্ডের জন্য @JsonManagedReference ব্যবহার করা হয়েছে এবং parent ফিল্ডের জন্য @JsonBackReference ব্যবহার করা হয়েছে।

5. Polymorphic Serialization with @JsonTypeInfo and @JsonSubTypes

Polymorphic objects serialize করার জন্য @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করা হয়। এই অ্যানোটেশনগুলির মাধ্যমে আপনি Parent-Child inheritance হ্যান্ডেল করতে পারেন।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Car.class, name = "car"),
    @JsonSubTypes.Type(value = Truck.class, name = "truck")
})
abstract class Vehicle {
    private String brand;

    // Getters and Setters
}

class Car extends Vehicle {
    private int seatingCapacity;

    // Getters and Setters
}

class Truck extends Vehicle {
    private int loadCapacity;

    // Getters and Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class PolymorphicSerialization {
    public static void main(String[] args) throws Exception {
        Vehicle car = new Car();
        ((Car) car).setSeatingCapacity(5);
        ((Car) car).setBrand("Toyota");

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(car);
        System.out.println(json);
    }
}
JSON Output:
{
  "type": "car",
  "brand": "Toyota",
  "seatingCapacity": 5
}

ব্যাখ্যা:

  • @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে Jackson Polymorphic objects সঠিকভাবে serialize করেছে এবং type প্রপার্টির মাধ্যমে যে subclass হবে তা নির্ধারণ করেছে।

6. Using @JsonFormat for Custom Date and Time Formatting

@JsonFormat অ্যানোটেশন ব্যবহার করে আপনি Date এবং Time ফিল্ডের জন্য কাস্টম ফরম্যাট নির্ধারণ করতে পারেন।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;

public class Event {
    private String name;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date eventDate;

    // Constructors, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Date;

public class DateFormatSerialization {
    public static void main(String[] args) throws Exception {
        Event event = new Event();
        event.setName("Meeting");
        event.setEventDate(new Date());

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(event);

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "Meeting",
  "eventDate": "2024-12-21 15:30:00"
}

  1. Complex Object Serialization/Deserialization এর জন্য Jackson এর অ্যানোটেশন ব্যবহার করে আপনি nested objects, collections, polymorphic types, এবং bidirectional relationships সহজেই manage করতে পারেন।
  2. Circular Reference সমস্যা সমাধানে @JsonManagedReference এবং @JsonBackReference ব্যবহার করা হয়।
  3. Polymorphic Serialization এর জন্য @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করা হয়।
  4. Custom Date and Time Formatting এর জন্য @JsonFormat অ্যানোটেশন ব্যবহার করা হয়।

Jackson এর এই অ্যানোটেশনগুলো complex data structures কে কার্যকরভাবে serialize এবং deserialize করতে সাহায্য করে, বিশেষত যখন আপনি nested, polymorphic, বা circular relationships নিয়ে কাজ করছেন।

Content added By

Practical উদাহরণ সহ Custom Serializer এবং Deserializer এর ব্যবহার

301

Jackson এর Custom Serializer এবং Custom Deserializer ব্যবহার করে আপনি JSON ডেটা কাস্টমাইজ করতে পারেন। এটি বিশেষভাবে কার্যকর যখন আপনি জটিল ডেটা রূপান্তর করতে চান, যেমন তারিখের বিশেষ ফরম্যাট, কাস্টম অবজেক্টস ইত্যাদি।

Custom Serializer:

Jackson Custom Serializer ব্যবহার করে আপনি একটি কাস্টম মেথড তৈরি করতে পারেন যা নির্দিষ্টভাবে JSON আউটপুট তৈরি করবে।

Custom Deserializer:

Jackson Custom Deserializer ব্যবহার করে আপনি JSON থেকে Java অবজেক্টে রূপান্তর করার সময় কাস্টম লজিক প্রয়োগ করতে পারেন।


Custom Serializer এর উদাহরণ

ধরা যাক, আমরা একটি Date অবজেক্টকে একটি কাস্টম ফরম্যাটে JSON-এ রূপান্তর করতে চাই।

Custom Serializer তৈরি করা:

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

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

public class CustomDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // Custom Date format
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formattedDate = formatter.format(value);
        gen.writeString(formattedDate);
    }
}

Object Class (Using the Custom Serializer):

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.util.Date;

public class Event {
    private String name;

    @JsonSerialize(using = CustomDateSerializer.class)
    private Date eventDate;

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

    // Getters and Setters
    public String getName() {
        return name;
    }

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

    public Date getEventDate() {
        return eventDate;
    }

    public void setEventDate(Date eventDate) {
        this.eventDate = eventDate;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Date;

public class CustomSerializerExample {
    public static void main(String[] args) throws Exception {
        Event event = new Event("Conference", new Date());

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(event);

        System.out.println(json);
    }
}
Output:
{
  "name": "Conference",
  "eventDate": "2024-12-21 15:30:00"
}

Custom Deserializer এর উদাহরণ

ধরা যাক, আমরা একটি String থেকে Date অবজেক্টে কাস্টম ডেটা রূপান্তর করতে চাই।

Custom Deserializer তৈরি করা:

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

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

public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateString = p.getText();
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return formatter.parse(dateString);
        } catch (Exception e) {
            throw new IOException("Invalid date format");
        }
    }
}

Object Class (Using the Custom Deserializer):

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.util.Date;

public class Event {
    private String name;

    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date eventDate;

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

    // Getters and Setters
    public String getName() {
        return name;
    }

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

    public Date getEventDate() {
        return eventDate;
    }

    public void setEventDate(Date eventDate) {
        this.eventDate = eventDate;
    }
}

Deserialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomDeserializerExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Conference\",\"eventDate\":\"2024-12-21 15:30:00\"}";

        ObjectMapper objectMapper = new ObjectMapper();
        Event event = objectMapper.readValue(json, Event.class);

        System.out.println("Event Name: " + event.getName());
        System.out.println("Event Date: " + event.getEventDate());
    }
}
Output:
Event Name: Conference
Event Date: Sat Dec 21 15:30:00 IST 2024

@JsonSerialize এবং @JsonDeserialize ব্যবহার:

  1. @JsonSerialize(using = CustomDateSerializer.class):
    • CustomDateSerializer ব্যবহার করে eventDate ফিল্ডকে কাস্টম ডেটা ফরম্যাটে JSON-এ রূপান্তর করা হয়।
  2. @JsonDeserialize(using = CustomDateDeserializer.class):
    • CustomDateDeserializer ব্যবহার করে JSON থেকে eventDate ফিল্ডের মানকে Date অবজেক্টে রূপান্তর করা হয়।

Custom Serializer এবং Deserializer এর সুবিধা:

  1. Custom Data Format:
    • ডেটা ফরম্যাট বা কাস্টম লজিক প্রয়োগের মাধ্যমে JSON ডেটা কাস্টমাইজ করা যায়।
  2. Complex Data Handling:
    • জটিল ডেটা (যেমন, ডেটা টাইপ, ডেটাবেজ রূপান্তর) কাস্টম Serializer এবং Deserializer দ্বারা সঠিকভাবে পরিচালনা করা যায়।
  3. Backward Compatibility:
    • পুরোনো ফরম্যাটে JSON ডেটা পরিচালনা করার জন্য কাস্টম Serializer/Deserializer ব্যবহার করা যেতে পারে।
  4. Better Error Handling:
    • কাস্টম ডেটা প্রক্রিয়া ও ভুল ডেটা ফরম্যাটে ভালোভাবে হ্যান্ডেল করা সম্ভব।

  • Jackson এর Custom Serializer এবং Custom Deserializer এর মাধ্যমে আপনি JSON Serialization এবং Deserialization কাস্টমাইজ করতে পারবেন।
  • এটি বিশেষভাবে দরকারী যখন JSON ফরম্যাটে পরিবর্তন, সঠিক টাইপ রূপান্তর, বা অন্য ধরনের কাস্টম প্রক্রিয়া করতে হয়।
  • @JsonSerialize এবং @JsonDeserialize অ্যানোটেশন ব্যবহার করে সহজেই কাস্টম Serializer এবং Deserializer প্রয়োগ করা যায়।
Content added By
Promotion

Are you sure to start over?

Loading...