কম্পিউটার টিউটোরিয়াল

জ্যাকসনে @JsonDeserialize অ্যানোটেশন দিয়ে কাস্টম ডিসিরিয়ালাইজার ইমপ্লিমেন্টেশন

@JsonDeserialize অ্যানোটেশন JSON থেকে জাভা অবজেক্ট ডিসিরিয়ালাইজ করার সময় কাস্টম ডিসিরিয়ালাইজার ডিক্লেয়ার করতে ব্যবহৃত হয়। StdDeserializer ক্লাস এক্সটেন্ড করে জেনেরিক টাইপ Employee দিয়ে কাস্টম ডিসিরিয়ালাইজার ইমপ্লিমেন্ট করা যায় এবং StdDeserializer ক্লাসের deserialize() মেথড ওভাররাইড করতে হয়।

সিনট্যাক্স

@Target(value={ANNOTATION_TYPE,METHOD,FIELD,TYPE,PARAMETER})
@Retention(value=RUNTIME)
public @interface JsonDeserialize

উদাহরণ

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.*;
import com.fasterxml.jackson.databind.deser.std.*;

public class JsonDeSerializeAnnotationTest {
    public static void main (String[] args) throws JsonProcessingException, IOException {
        Employee emp = new Employee(115, "Adithya");
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeValueAsString(emp);
        emp = mapper.readValue(jsonString, Employee.class);
        System.out.println(emp);
    }
}

// CustomDeserializer class
class CustomDeserializer extends StdDeserializer<Employee> {
    public CustomDeserializer(Class<Employee> t) {
        super(t);
    }
    
    public CustomDeserializer() {
        this(Employee.class);
    }
    
    @Override
    public Employee deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        int id = 0;
        String name = null;
        JsonToken currentToken = null;
        
        while((currentToken = jp.nextValue()) != null) {
            switch(currentToken) {
                case VALUE_NUMBER_INT:
                    if(jp.getCurrentName().equals("id")) {
                        id = jp.getIntValue();
                    }
                    break;
                case VALUE_STRING:
                    switch(jp.getCurrentName()) {
                        case "name":
                            name = jp.getText();
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }
        }
        return new Employee(id, name);
    }
}

// Employee class
@JsonDeserialize(using=CustomDeserializer.class)
class Employee {
    private int id;
    private String name;
    
    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public int getId() { return id; }
    public String getName() { return name; }
    
    @Override
    public String toString() {
        return "ID: " + this.id + "\nName: " + this.name;
    }
}

আউটপুট

ID: 115
Name: Adithya

ব্যবহার ক্ষেত্র

  • জটিল JSON স্ট্রাকচার থেকে অবজেক্ট তৈরি করতে
  • লিগ্যাসি/থার্ড-পার্টি JSON ফরম্যাট হ্যান্ডেল করতে
  • ডেটা ট্রান্সফরমেশন/ভ্যালিডেশন ডিসিরিয়ালাইজেশনের সময় করতে
  • পলিমরফিক টাইপ হ্যান্ডলিং

নোট

জাভা ৮+ এ JsonDeserializer ফাংশনাল ইন্টারফেস হিসেবে ব্যবহার করা যায়। @JsonDeserialize(using = MyDeserializer.class) ক্লাস বা ফিল্ড লেভেলে দিয়ে ব্যবহার করুন।

  1. জাভা ব্যবহার করে ওপেনসিভিতে বাইল্যাটেরাল ব্লার কীভাবে ইমপ্লিমেন্ট করবেন?

  2. জাভা ব্যবহার করে ওপেনসিভিতে গাউসিয়ান ব্লার কীভাবে ইমপ্লিমেন্ট করবেন?

  3. জাভা ব্যবহার করে ওপেনসিভিতে ব্লার (অ্যভারেজিং) কীভাবে ইমপ্লিমেন্ট করবেন?

  4. জাভাতে JWindow ব্যবহার করে স্প্ল্যাশ স্ক্রিন কীভাবে বাস্তবায়ন করবেন?