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

জাভাতে @JsonAnyGetter এবং @JsonAnySetter অ্যানোটেশন কখন কল হয়

@JsonAnyGetter অ্যানোটেশন একটি Map-কে কন্টেইনার হিসেবে ব্যবহার করতে সক্ষম করে那些 প্রপার্টিগুলো যা আমরা JSON-এ সিরিয়ালাইজ করতে চাই। @JsonAnySetter অ্যানোটেশন জ্যাকসনকে নির্দেশ দেয় যে JSON অবজেক্টে সব অনসিন্ড ফিল্ডের জন্য একই সেটার মেথড কল করবে, অর্থাৎ যেসব ফিল্ড ইতিমধ্যে জাভা অবজেক্টে প্রপার্টি বা সেটার মেথডে ম্যাপ করা নেই।

সিনট্যাক্স

public @interface JsonAnyGetter
public @interface JsonAnySetter

উদাহরণ

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

public class JsonAnyGetterAndJsonAnySetterTest { 
    public static void main(String args[]) throws JsonGenerationException, JsonMappingException, IOException { 
        Employee emp1 = new Employee(); 
        emp1.setFirstName("Adithya"); 
        emp1.setLastName("Sai"); 
        emp1.setEmpId(125); 
        emp1.getAdditionalInformation().put("technology1", "Machine Learning"); 
        emp1.getAdditionalInformation().put("technology2", "Robotics"); 
        ObjectMapper mapper = new ObjectMapper(); 
        String jsonStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(emp1); 
        System.out.println(jsonStr); 
        System.out.println("Deserializing JSON to Object:"); 
        Employee emp2 = mapper.readValue(jsonStr, Employee.class); 
        System.out.println("id : " + emp2.getEmpId()); 
        System.out.println("firstName : " + emp2.getFirstName()); 
        System.out.println("lastName : " + emp2.getLastName()); 
        System.out.println("Additional information : " + emp2.getAdditionalInformation()); 
    } 
} 

// Employee ক্লাস
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"firstName", "lastName", "technologies", "empId"})
class Employee { 
    @JsonProperty("EMPLOYEE_ID")
    private int empId; 
    @JsonProperty("EMPLOYEE_FIRST_NAME")
    private String firstName; 
    @JsonProperty("EMPLOYEE_LAST_NAME")
    private String lastName; 
    private Map<String, String> additionalInformation = new HashMap<>(); 
    
    public int getEmpId() { return empId; }
    public void setEmpId(int empId) { this.empId = empId; }
    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    
    @JsonAnyGetter
    public Map<String, String> getAdditionalInformation() { return additionalInformation; }
    public void setAdditionalInformation(Map<String, String> additionalInformation) { this.additionalInformation = additionalInformation; }
    
    @JsonAnySetter
    public void setAdditionalProperty(final String name, final String value) { 
        this.additionalInformation.put(name, value); 
    } 
}

আউটপুট

{ 
  "EMPLOYEE_FIRST_NAME" : "Adithya", 
  "EMPLOYEE_LAST_NAME" : "Sai", 
  "EMPLOYEE_ID" : 125, 
  "technology1" : "Machine Learning", 
  "technology2" : "Robotics" 
}
Deserializing JSON to Object:
id : 125
firstName : Adithya
lastName : Sai
Additional information : {technology1=Machine Learning, technology2=Robotics}

ব্যাখ্যা: @JsonAnyGetter लगे মেথড (getAdditionalInformation) সিরিয়ালাইজেশনের সময় Map-এর সব এন্ট্রি JSON-এ ফ্ল্যাটেন করে যোগ করে। @JsonAnySetter लगे মেথড (setAdditionalProperty) ডিসিরিয়ালাইজেশনের সময় অজানা প্রপার্টিগুলো Map-এ সংগ্রহ করে।

  1. জাভাতে pack() মেথড কখন ব্যবহার করবেন

  2. জাভাতে invokeLater() মেথড কল করার পদ্ধতি

  3. জাভাতে String ক্লাসের intern() মেথড কখন ব্যবহার করবেন?

  4. জাভাতে কখন অ্যাবস্ট্রাক্ট ক্লাস এবং কখন ইন্টারফেস ব্যবহার করবেন?