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

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

@JsonSerialize অ্যানোটেশন ফিল্ড সিরিয়ালাইজেশনের সময় কাস্টম সিরিয়ালাইজার ডিক্লেয়ার করতে ব্যবহৃত হয়। StdSerializer ক্লাস এক্সটেন্ড করে কাস্টম সিরিয়ালাইজার ইমপ্লিমেন্ট করা যায় এবং StdSerializer ক্লাসের serialize() মেথড ওভাররাইড করতে হয়।

সিনট্যাক্স

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

উদাহরণ

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

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

// CustomSerializer class
class CustomSerializer extends StdSerializer<Employee> {
    public CustomSerializer(Class<Employee> t) {
        super(t);
    }
    
    public CustomSerializer() {
        this(Employee.class);
    }
    
    @Override
    public void serialize(Employee emp, JsonGenerator jgen, SerializerProvider sp) throws IOException, JsonGenerationException {
        StringBuilder sb = new StringBuilder();
        jgen.writeStartObject();
        jgen.writeNumberField("id", emp.getId());
        jgen.writeStringField("name", emp.getName());
        for(String s: emp.getLanguages()) {
            sb.append(s).append(";");
        }
        jgen.writeStringField("languages", sb.toString());
        jgen.writeEndObject();
    }
}

// Employee class
@JsonSerialize(using=CustomSerializer.class)
class Employee {
    private int id;
    private String name;
    private String[] languages;
    
    public Employee(int id, String name, String[] languages) {
        this.id = id;
        this.name = name;
        this.languages = languages;
    }
    
    public int getId() { return this.id; }
    public String getName() { return this.name; }
    public String[] getLanguages() { return this.languages; }
    
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("ID: ").append(this.id)
            .append("\nName: ").append(this.name).append("\nLanguages:");
        for(String s: this.languages) {
            sb.append(" ").append(s);
        }
        return sb.toString();
    }
}

আউটপুট

{
  "id" : 115,
  "name" : "Adithya",
  "languages" : "Java;Python;Scala;"
}

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

  • কাস্টম JSON আউটপুট ফরম্যাট (ডেট রেফারেন্স, এনাম, কালেকশন ফরম্যাটিং)
  • সেনসিটিভ ডেটা মাস্কিং (ক্রেডিট কার্ড, পাসওয়ার্ড)
  • পলিমরফিক টাইপ সিরিয়ালাইজেশন
  • থার্ড-পার্টি API-এর জন্য নির্দিষ্ট ফরম্যাট

আধুনিক বিকল্প (জাভা ৮+)

// ফাংশনাল ইন্টারফেস হিসেবে ব্যবহার
@JsonSerialize(using = (emp, gen, provider) -> {
    gen.writeStartObject();
    gen.writeNumberField("id", emp.getId());
    gen.writeStringField("name", emp.getName());
    gen.writeEndObject();
})
class Employee { ... }
  1. জাভা ব্যবহার করে ওপেনসিভিতে বাইল্যাটেরাল ব্লার কীভাবে ইমপ্লিমেন্ট করবেন?

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

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

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