Custom Deserialization

JSON থেকে Java Object (Deserialization) - জ্যাকসন (Jackson) - Java Technologies

290

Jackson একটি শক্তিশালী লাইব্রেরি যা Java objects এবং JSON এর মধ্যে ডেটা রূপান্তরের জন্য ব্যবহৃত হয়। তবে, কখনও কখনও আমাদের JSON ডেটার কিছু নির্দিষ্ট ফরম্যাট থাকে যা default deserialization পদ্ধতির মাধ্যমে রূপান্তর করা যায় না। এমন পরিস্থিতিতে custom deserialization ব্যবহার করা হয়।

Custom Deserialization এর মাধ্যমে আপনি Jackson-কে নির্দেশ দিতে পারেন কিভাবে JSON থেকে Java objects তৈরি করা হবে। এটি তখন ব্যবহার করা হয় যখন JSON ফরম্যাট এবং Java object এর মধ্যে কিছু কাস্টম মাপের বা প্রক্রিয়ার প্রয়োজন।

এখানে Jackson এর মাধ্যমে Custom Deserialization এর প্রক্রিয়া আলোচনা করা হলো।


1. Custom Deserialization এর জন্য প্রস্তুতি

ধরা যাক, আমাদের একটি Person ক্লাস আছে এবং আমরা birthdate ফিল্ডের JSON ডেটাকে কাস্টমভাবে ডেসিরিয়ালাইজ করতে চাই, কারণ এটি yyyy-MM-dd ফরম্যাটে রয়েছে, কিন্তু আমাদের Java LocalDate ফরম্যাটে এটি রাখতে হবে।

Person Class (with LocalDate)

import com.fasterxml.jackson.annotation.JsonFormat;
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 LocalDate getBirthDate() {
        return birthDate;
    }
}

এই ক্লাসে birthDate হল একটি LocalDate টাইপের ফিল্ড, যা JSON ফরম্যাটে yyyy-MM-dd আকারে আসবে।


2. Custom Deserializer তৈরি করা

Jackson আপনাকে custom deserializer তৈরি করার সুযোগ দেয় যা JSON ডেটাকে আপনার পছন্দমতো Java object-এ রূপান্তর করবে।

Step 1: Create a Custom Deserializer

আপনি JsonDeserializer ইন্টারফেস ব্যবহার করে একটি কাস্টম ডেসিরিয়ালাইজার তৈরি করতে পারেন। এখানে আমরা LocalDate এর জন্য কাস্টম deserializer তৈরি করব।

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String date = p.getText();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(date, formatter);
    }
}
  • Explanation:
    • LocalDateDeserializer ক্লাসটি JsonDeserializer থেকে ইনহেরিট করেছে এবং deserialize() মেথডে JSON ডেটাকে yyyy-MM-dd ফরম্যাটে LocalDate এ রূপান্তর করছে।

3. Custom Deserializer ব্যবহার করা

এখন, আমরা আমাদের Person ক্লাসের birthDate ফিল্ডে Custom Deserializer অ্যাপ্লাই করব। এটি করার জন্য আমরা @JsonDeserialize অ্যানোটেশন ব্যবহার করব।

Step 2: Apply the Custom Deserializer to the birthDate field

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.time.LocalDate;

public class Person {
    private String name;

    @JsonDeserialize(using = LocalDateDeserializer.class)
    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 LocalDate getBirthDate() {
        return birthDate;
    }
}
  • Explanation:
    • @JsonDeserialize(using = LocalDateDeserializer.class) অ্যানোটেশনটি birthDate ফিল্ডে কাস্টম LocalDateDeserializer ব্যবহার করতে বলে, যাতে JSON ডেটাকে কাস্টম ফরম্যাটে LocalDate এ রূপান্তর করা হয়।

4. Deserialization Example

এখন, আমরা Person ক্লাসের একটি JSON রূপে ডেসিরিয়ালাইজ করার উদাহরণ দেখব।

Example JSON:

{
  "name": "John Doe",
  "birthDate": "1990-05-15"
}

Deserialization Code:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John Doe\",\"birthDate\":\"1990-05-15\"}";

        ObjectMapper objectMapper = new ObjectMapper();
        
        // Deserialize JSON to Person object
        Person person = objectMapper.readValue(json, Person.class);
        
        System.out.println("Name: " + person.getName());
        System.out.println("BirthDate: " + person.getBirthDate());
    }
}
  • Explanation:
    • এখানে ObjectMapper ব্যবহার করে JSON ডেটাকে Person অবজেক্টে রূপান্তর করা হচ্ছে। কাস্টম LocalDateDeserializer এর মাধ্যমে birthDate ফিল্ডটি সঠিকভাবে ডেসিরিয়ালাইজ হবে।

Output:

Name: John Doe
BirthDate: 1990-05-15

5. Using Jackson Mixins for Custom Deserialization (Optional)

যদি আপনি কোনো ক্লাস পরিবর্তন না করে কাস্টম ডেসিরিয়ালাইজার যোগ করতে চান, তবে Jackson Mixins ব্যবহার করতে পারেন। এটি আপনাকে একটি existing class এ কাস্টম ডেসিরিয়ালাইজার অ্যাসাইন করতে সাহায্য করবে, যেখানে আপনি সেই ক্লাসের সোর্স কোডে কোন পরিবর্তন না করে কাজ করতে পারবেন।

Mixin Example:

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

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John Doe\",\"birthDate\":\"1990-05-15\"}";

        // Create ObjectMapper and register Mixin
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.addMixIn(Person.class, PersonMixin.class);
        
        // Deserialize JSON to Person object
        Person person = objectMapper.readValue(json, Person.class);
        
        System.out.println("Name: " + person.getName());
        System.out.println("BirthDate: " + person.getBirthDate());
    }

    @JsonDeserialize(using = LocalDateDeserializer.class)
    private abstract static class PersonMixin {}
}
  • Explanation:
    • এখানে আমরা PersonMixin ব্যবহার করছি যা LocalDateDeserializer অ্যাসাইন করেছে, এবং এটি Person ক্লাসের উপর প্রভাব ফেলবে, তবে কোনো পরিবর্তন ছাড়াই।

Jackson-এর মাধ্যমে Custom Deserialization ব্যবহারের ফলে আপনি JSON ডেটার একটি কাস্টম ফরম্যাটে রূপান্তর করতে পারেন, যা আপনার Java ক্লাসের সাথে সঠিকভাবে মাপ খায়। আপনি JsonDeserializer ইন্টারফেস ব্যবহার করে কাস্টম ডেসিরিয়ালাইজার তৈরি করতে পারেন এবং Jackson এর @JsonDeserialize অ্যানোটেশন ব্যবহার করে তা আপনার Java ক্লাসে অ্যাপ্লাই করতে পারেন।

  • Custom Deserialization Jackson এর সবচেয়ে শক্তিশালী বৈশিষ্ট্যগুলোর একটি, যা আপনার কোডের নমনীয়তা এবং কাস্টমাইজেশন ক্ষমতা বৃদ্ধি করে।
  • Jackson Mixins ব্যবহার করে আপনি ক্লাসের সোর্স কোডে কোনো পরিবর্তন না করেও কাস্টম ডেসিরিয়ালাইজার অ্যাপ্লাই করতে পারেন।

Jackson এর custom deserialization ফিচারটি আপনাকে JSON ডেটার জটিল কাঠামো হ্যান্ডেল করতে সহায়তা করবে এবং আপনার কোড আরও শক্তিশালী এবং নমনীয় করে তুলবে।

Content added By
Promotion

Are you sure to start over?

Loading...