@JsonUnwrapped এবং Nested Properties গাইড ও নোট

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

@JsonUnwrapped Jackson-এর একটি অ্যানোটেশন যা nested properties (অর্থাৎ, একটি অবজেক্টের ভেতরে আরেকটি অবজেক্ট) flattening করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি nested অবজেক্টের ফিল্ডগুলোকে মূল অবজেক্টের ফিল্ডের মতো JSON আউটপুটে সরাসরি অন্তর্ভুক্ত করতে পারেন।

এটি JSON-এ nested properties কে "unwrapping" করে ফ্ল্যাট আউটপুট তৈরি করে, যার ফলে nested অবজেক্টের পরিবর্তে তার অভ্যন্তরীণ ফিল্ডগুলো সরাসরি মূল অবজেক্টে যুক্ত হয়।


@JsonUnwrapped এর ব্যবহার

১. সাধারণ ব্যবহার

ধরা যাক, আমাদের কাছে একটি Person অবজেক্ট এবং Address নামে একটি nested অবজেক্ট রয়েছে। Address অবজেক্টের ফিল্ডগুলোকে Person অবজেক্টের অংশ হিসেবে JSON আউটপুটে যুক্ত করতে চাইলে আমরা @JsonUnwrapped ব্যবহার করতে পারি।

import com.fasterxml.jackson.annotation.JsonUnwrapped;

public class Person {
    private String name;
    
    @JsonUnwrapped
    private Address address; // Nested object to be unwrapped

    // Constructor, Getters and Setters
}
public class Address {
    private String street;
    private String city;
    private String country;

    // Constructor, Getters and Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("Main St", "Dhaka", "Bangladesh");
        Person person = new Person("Rahim", address);

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(person);
        
        System.out.println(json);
    }
}
JSON Output:
{
  "name": "Rahim",
  "street": "Main St",
  "city": "Dhaka",
  "country": "Bangladesh"
}

Explanation:

  • @JsonUnwrapped ব্যবহার করে, Address অবজেক্টের ফিল্ডগুলো Person অবজেক্টের সাথে মিশে গিয়ে JSON আউটপুটে সরাসরি সন্নিবেশিত হয়েছে। এখানে Address অবজেক্টের ফিল্ডগুলো street, city, এবং country সরাসরি Person অবজেক্টে উপস্থিত হয়েছে।

@JsonUnwrapped এর আরও উন্নত ব্যবহার

২. Nested Object এর Prefix/ Suffix কাস্টমাইজ করা

@JsonUnwrapped ব্যবহার করার সময় আপনি nested properties-এর জন্য একটি prefix বা suffix যোগ করতে পারেন, যা nested ফিল্ডগুলোর নামের সাথে যুক্ত হবে। এর মাধ্যমে আরও কাস্টমাইজড JSON আউটপুট তৈরি করা যায়।

ব্যবহার উদাহরণ:
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {
    private String name;

    @JsonUnwrapped
    @JsonProperty("address_info")
    private Address address;

    // Constructor, Getters and Setters
}

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

    // Constructor, Getters and Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("Main St", "Dhaka", "Bangladesh");
        Person person = new Person("Rahim", address);

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

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "Rahim",
  "address_info": {
    "street": "Main St",
    "city": "Dhaka",
    "country": "Bangladesh"
  }
}

Explanation:

এখানে @JsonUnwrapped ব্যবহার করা হয়েছে address ফিল্ডের জন্য, এবং @JsonProperty("address_info") দ্বারা এটি JSON আউটপুটে address_info নামক এক নতুন prefix যুক্ত করেছে।


@JsonUnwrapped এবং @JsonProperty একসাথে ব্যবহার

@JsonUnwrapped কে @JsonProperty এর সঙ্গে একত্রে ব্যবহার করলে আরও বেশি কাস্টমাইজেশন করা সম্ভব। যেমন nested অবজেক্টের ফিল্ড নাম বদলানো, পদ্ধতির নাম নির্ধারণ করা বা আরো জটিল nested structures হ্যান্ডলিং করা।

import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {
    private String name;
    
    @JsonUnwrapped
    @JsonProperty("address_details")
    private Address address;

    // Constructor, Getters and Setters
}

কেন @JsonUnwrapped ব্যবহার করবেন?

  1. Flattening Nested Objects:
    • Nested objects কে flattens করে JSON আউটপুটে ফিল্ডগুলোকে সরাসরি উপস্থাপন করা যায়।
  2. Data Representation Simplification:
    • সহজ এবং স্পষ্ট JSON আউটপুট তৈরি করতে nested objects কাস্টমাইজ করতে সহায়ক।
  3. Complex Nested JSON Structures:
    • জটিল nested JSON structures কে সহজ এবং সহজবোধ্য ভাবে map করার জন্য এটি ব্যবহার করা হয়।
  4. Custom Prefixes/Suffixes:
    • আপনি যখন nested ফিল্ডগুলোর নাম কাস্টমাইজ করতে চান এবং বিশেষ prefix/suffix যোগ করতে চান।

@JsonUnwrapped এর সীমাবদ্ধতা

  1. Circular References:
    • Circular references থাকলে @JsonUnwrapped ব্যবহার করা যেতে পারে না কারণ এটি অবজেক্টের ক্ষেত্র পুনরাবৃত্তি করতে পারে, যা StackOverflowError সৃষ্টি করতে পারে।
  2. Deep Nested Objects:
    • অনেক গভীর nested structures handling করা কঠিন হতে পারে, বিশেষ করে যখন অনেক nested objects একে অপরকে রেফারেন্স করে।

  1. @JsonUnwrapped একটি শক্তিশালী টুল যা JSON Serialization-এর সময় nested objects কে flattens করতে সাহায্য করে এবং JSON ডেটার গঠন সহজ করে।
  2. এটি nested properties কে সরাসরি মূল অবজেক্টে অন্তর্ভুক্ত করতে ব্যবহৃত হয়, যা API বা ডেটা ফরম্যাটের ক্ষেত্রে সহজে মানানসই হতে সাহায্য করে।
  3. Prefix/Suffix ব্যবহার করে JSON আউটপুট কাস্টমাইজ করা সম্ভব, এবং এটি দ্রুত এবং কার্যকরভাবে nested structures পরিচালনা করার জন্য একটি দরকারী টুল।
Content added By

@JsonUnwrapped এর ধারণা এবং প্রয়োগ

304

@JsonUnwrapped Jackson-এর একটি অ্যানোটেশন, যা JSON Serialization এবং Deserialization-এর সময় Nested Objects কে "unwrap" (অর্থাৎ, তাদের ফিল্ডগুলোকে মাদার অবজেক্টের মধ্যে সোজা ফ্ল্যাট আকারে) করার জন্য ব্যবহৃত হয়।

এই অ্যানোটেশনটি ব্যবহার করার ফলে, nested অবজেক্টের সকল ফিল্ড মাদার অবজেক্টের ফিল্ড হিসেবে দেখা যাবে এবং এটি JSON অবজেক্টে সরাসরি অন্তর্ভুক্ত হবে।


@JsonUnwrapped এর মূল উদ্দেশ্য

  • Nested Object Flattening: একটি অবজেক্টের ভিতরের অবজেক্টের ফিল্ডগুলোকে মূল অবজেক্টের অংশ হিসেবে flatten করা যায়, যাতে JSON আউটপুটে এগুলো পৃথকভাবে না দেখায়, বরং একত্রে একটি JSON অবজেক্টে পরিণত হয়।
  • Compact JSON Representation: JSON ফাইলটি আরো compact এবং সহজবোধ্য করতে সাহায্য করে, যখন nested অবজেক্টের ফিল্ডগুলো সরাসরি উপরের স্তরের অবজেক্টের অংশ হিসেবে অন্তর্ভুক্ত হয়।

@JsonUnwrapped এর ব্যবহার

১. সাধারণ উদাহরণ

ধরা যাক, আমাদের একটি Address অবজেক্ট এবং একটি Person অবজেক্ট আছে, যেখানে Person এর মধ্যে Address রয়েছে। সাধারণভাবে, যদি @JsonUnwrapped ব্যবহার না করা হয়, তাহলে Address অবজেক্টটি JSON-এ আলাদা অবজেক্ট হিসেবে থাকবে। কিন্তু @JsonUnwrapped ব্যবহার করে আমরা এটি ফ্ল্যাট করে ফেলতে পারি।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonUnwrapped;

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

    // Constructors, Getters and Setters
    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

public class Person {
    private String name;
    
    @JsonUnwrapped  // This unwraps the Address fields into the Person object
    private Address address;

    // Constructors, Getters and Setters
    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("1234 Elm St", "Springfield");
        Person person = new Person("John Doe", address);

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

        System.out.println(json);
    }
}

JSON Output (Unwrapped):

{
  "name": "John Doe",
  "street": "1234 Elm St",
  "city": "Springfield"
}

ব্যাখ্যা:

  • @JsonUnwrapped এর মাধ্যমে Person অবজেক্টের মধ্যে থাকা Address অবজেক্টের ফিল্ডগুলো সরাসরি JSON আউটপুটে name, street, এবং city হিসেবে যোগ হয়ে যায়।
  • Nested Address অবজেক্টটি এখন Person অবজেক্টের অংশ হিসেবে ফ্ল্যাট হয়ে গেছে, এবং address নামক ফিল্ডটি আর JSON আউটপুটে দেখা যায় না।

@JsonUnwrapped এর আরও কিছু অপশন

২. @JsonUnwrapped এর prefix এবং suffix ব্যবহার

আপনি @JsonUnwrapped এর মাধ্যমে nested অবজেক্টের ফিল্ডগুলোর সাথে prefix এবং suffix যোগ করতে পারেন।

import com.fasterxml.jackson.annotation.JsonUnwrapped;

public class Person {
    private String name;

    @JsonUnwrapped(prefix = "address_")  // Prefix for Address fields
    private Address address;

    // Constructors, Getters and Setters
}

Serialization Example (with prefix):

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedPrefixExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("1234 Elm St", "Springfield");
        Person person = new Person("John Doe", address);

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

        System.out.println(json);
    }
}

JSON Output (with prefix):

{
  "name": "John Doe",
  "address_street": "1234 Elm St",
  "address_city": "Springfield"
}
  • prefix যুক্ত করার মাধ্যমে address_street এবং address_city হিসেবে JSON ফিল্ডের নাম পরিবর্তিত হয়েছে।

@JsonUnwrapped এর ব্যবহারিক সুবিধা

  1. Compact JSON Structure:
    • Nested অবজেক্টের ফিল্ডগুলো সরাসরি মূল অবজেক্টের সাথে যুক্ত হয়ে JSON স্ট্রাকচারকে আরও compact করে তোলে।
  2. API Response Clarity:
    • বিশেষ করে REST API-তে, nested অবজেক্টের ক্ষেত্রগুলো ফ্ল্যাটভাবে পাওয়া সহজ হয়, যা ক্লায়েন্ট সাইডে প্রক্রিয়া সহজ করে।
  3. Customization:
    • prefix এবং suffix যোগ করার মাধ্যমে আরো কাস্টমাইজড JSON ফরম্যাট তৈরি করা যায়।

@JsonUnwrapped এর সীমাবদ্ধতা

  1. Circular References:
    • Circular references হলে @JsonUnwrapped কাজ নাও করতে পারে। এটি Circular reference সমস্যা সমাধানে পর্যাপ্ত নয়, তাই তখন @JsonManagedReference এবং @JsonBackReference ব্যবহার করা উচিত।
  2. Complex Nested Structures:
    • খুব গভীর nested structures-এ @JsonUnwrapped এর ব্যবহার কিছুটা জটিল হতে পারে এবং JSON এর আউটপুট নন-স্ট্যান্ডার্ড হতে পারে।

  • @JsonUnwrapped হল একটি শক্তিশালী টুল, যা Nested অবজেক্টের ফিল্ডগুলোকে মূল অবজেক্টের অংশ হিসেবে "unwrap" করে JSON Serialization এবং Deserialization প্রক্রিয়া সহজ করে।
  • এটি compact JSON structure তৈরি করতে সাহায্য করে, এবং API response এর স্পষ্টতা বৃদ্ধি করে।
  • prefix এবং suffix ব্যবহার করে JSON আউটপুটকে কাস্টমাইজ করা সম্ভব।
Content added By

Nested Objects কে unwrapped করে JSON properties এ map করা

323

Jackson লাইব্রেরি ব্যবহার করে যখন Nested Objects থাকে, তখন @JsonUnwrapped অ্যানোটেশন ব্যবহার করে এই nested objects-এর ফিল্ডগুলোকে সরাসরি JSON properties হিসেবে মেপ করা যায়। এতে nested object-এর ভিতরের ফিল্ডগুলোকে মূল JSON-এর অংশ হিসেবে প্রক্রিয়া করা হয়, যা এক্সট্রা নেস্টিং থেকে মুক্তি দেয়।


@JsonUnwrapped অ্যানোটেশন কী?

  • @JsonUnwrapped একটি Jackson annotation যা nested object বা embedded object থেকে properties সরাসরি flattened করে JSON ডেটাতে প্রকাশ করে।
  • এর মাধ্যমে nested object এর সমস্ত ফিল্ডকে parent object এর JSON properties হিসেবে উপস্থিত করা যায়।

@JsonUnwrapped ব্যবহারের উদাহরণ

1. Nested Object Example:

ধরা যাক আমাদের একটি Address নামক ক্লাস রয়েছে, যা User নামক একটি ক্লাসের মধ্যে Nested Object হিসেবে রয়েছে।

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

    // Constructors
    public Address(String street, String city, String zipCode) {
        this.street = street;
        this.city = city;
        this.zipCode = zipCode;
    }

    // Getters and Setters
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
}
User Class with Nested Address Object:
import com.fasterxml.jackson.annotation.JsonUnwrapped;

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

    @JsonUnwrapped
    private Address address;

    // Constructors
    public User(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

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

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Serialization Example (Flattening Nested Object)

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    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 objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);

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

এখানে, address এর street, city, এবং zipCode ফিল্ডগুলো সরাসরি User JSON-এর অংশ হয়ে গেছে, কারণ @JsonUnwrapped ব্যবহার করা হয়েছে।


@JsonUnwrapped ব্যবহার করে Nested Object গুলো Unwrap করা

  1. Flattening Nested Object:
    • @JsonUnwrapped এর সাহায্যে nested object-এর সকল প্রোপার্টি parent object-এর সঙ্গে যুক্ত হয়ে যায়।
  2. JSON Output Simple and Clean:
    • Nested object গুলোর মধ্যে ভেতরের ডেটা দেখতে পাওয়া যায়, যাতে ফ্ল্যাট JSON তৈরি হয়।

Nested Object গুলোর উপর আরও কাস্টমাইজেশন

@JsonUnwrapped with prefix and suffix

Jackson এর @JsonUnwrapped অ্যানোটেশনকে আপনি prefix এবং suffix যুক্ত করতে পারেন, যা প্রতিটি nested object ফিল্ডের নামের আগে এবং পরে কাস্টম টেক্সট অ্যাড করবে।

Example with Prefix and Suffix:
import com.fasterxml.jackson.annotation.JsonUnwrapped;

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

    @JsonUnwrapped(prefix = "address_")
    private Address address;

    // Constructors, Getters, and Setters
}
JSON Output with Prefix:
{
  "name": "Rahim",
  "age": 30,
  "address_street": "123 Main St",
  "address_city": "Dhaka",
  "address_zipCode": "1212"
}

@JsonUnwrapped একটি Nested Object এর অংশবিশেষ JSON থেকে বাদ দেওয়া

যদি আপনি কিছু nested ফিল্ড বাদ দিতে চান, তবে আপনি @JsonIgnore অ্যানোটেশন ব্যবহার করতে পারেন।

Example:

import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.annotation.JsonIgnore;

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

    @JsonIgnore
    private String zipCode;

    // Getters and Setters
}

এখানে zipCode ফিল্ডটি Unwrapped JSON থেকে বাদ দেওয়া হয়েছে, কারণ এতে @JsonIgnore অ্যানোটেশন ব্যবহার করা হয়েছে।


@JsonUnwrapped বনাম @JsonProperty

  • @JsonUnwrapped: এটি nested object কে parent JSON object এর মধ্যে সমন্বিত করে, এটি পুরো nested object ফিল্ড গুলি সরাসরি ফ্ল্যাট আউটপুটে প্রতিফলিত করে।
  • @JsonProperty: এটি একটি নির্দিষ্ট Java ফিল্ড বা মেথডের নাম পরিবর্তন বা কাস্টমাইজ করার জন্য ব্যবহৃত হয়।

  1. @JsonUnwrapped একটি শক্তিশালী অ্যানোটেশন, যা nested objects-এর ডেটাকে parent object এর অংশ হিসেবে flatten করে।
  2. এটি JSON structure সহজ এবং পরিষ্কার করতে সহায়তা করে, বিশেষত যখন nested data কাস্টম ফরম্যাটে প্রকাশ করতে হয়।
  3. Prefix এবং Suffix ব্যবহার করে JSON এর nested fields কাস্টমাইজ করা যায়।
  4. Circular references বা complex relationships এ কাজ করার সময় @JsonIgnore ব্যবহার করে nested fields বাদ দেয়া সম্ভব।

@JsonUnwrapped Jackson এর একটি গুরুত্বপূর্ণ অ্যানোটেশন যা JSON ফরম্যাট সহজ করে তোলে এবং nested data সরাসরি উপস্থাপন করতে সহায়তা করে।

Content added By

Complex Object serialization এবং deserialization

269

Jackson হল একটি শক্তিশালী লাইব্রেরি যা JSON Serialization এবং Deserialization-এর জন্য ব্যবহৃত হয়। Complex Objects এর ক্ষেত্রে Jackson সঠিকভাবে কাজ করতে পারে, যখন আপনি সঠিকভাবে annotations ব্যবহার করেন। Complex Objects বলতে বোঝানো হয়, যেমন nested objects, collections (List, Map, Set), অথবা inheritance hierarchies (Parent-Child রিলেশনশিপ)। এই ধরনের অবজেক্টগুলোকে JSON-এ রূপান্তর করার জন্য Jackson কিছু নির্দিষ্ট অ্যানোটেশন এবং কৌশল সরবরাহ করে।


Complex Object Serialization এবং Deserialization এর জন্য Jackson এর ব্যবহার

1. Nested Objects

Nested objects বলতে বোঝানো হয়, যখন একটি Object অন্য একটি Object কে অন্তর্ভুক্ত করে। Jackson এটি স্বয়ংক্রিয়ভাবে handle করে, তবে আপনি যদি কিছু কাস্টমাইজেশন চান, তখন @JsonProperty বা @JsonManagedReference / @JsonBackReference ব্যবহার করতে পারেন।

উদাহরণ:
import com.fasterxml.jackson.annotation.JsonProperty;

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

    @JsonProperty("user_details")
    private UserDetails details;

    // Getters and Setters
}

class UserDetails {
    private String address;
    private String phone;

    // Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;

public class NestedObjectSerialization {
    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setId(1);
        user.setName("Rahim");
        UserDetails details = new UserDetails();
        details.setAddress("Dhaka");
        details.setPhone("1234567890");
        user.setDetails(details);

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

        System.out.println(json);
    }
}
JSON Output:
{
  "id": 1,
  "name": "Rahim",
  "user_details": {
    "address": "Dhaka",
    "phone": "1234567890"
  }
}

2. Collection Serialization (List, Set, Map)

Jackson List, Set, এবং Map সহ অন্যান্য Collection Types-এর Serialization এবং Deserialization সমর্থন করে।

উদাহরণ: List ব্যবহার
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

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

    @JsonProperty("user_hobbies")
    private List<String> hobbies;

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

public class CollectionSerialization {
    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setId(1);
        user.setName("Rahim");
        user.setHobbies(Arrays.asList("Reading", "Gaming", "Traveling"));

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

        System.out.println(json);
    }
}
JSON Output:
{
  "id": 1,
  "name": "Rahim",
  "user_hobbies": ["Reading", "Gaming", "Traveling"]
}

3. Inheritance (Parent-Child Relationship)

Jackson Polymorphic Serialization সমর্থন করে, যা আপনাকে Parent-Child রিলেশনশিপের মধ্যে Object Serialization এবং Deserialization করতে দেয়। @JsonTypeInfo এবং @JsonSubTypes এর মাধ্যমে আপনি Polymorphism কনফিগার করতে পারেন।

উদাহরণ:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@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;

    // Getter and Setter
}

class Car extends Vehicle {
    private int seatingCapacity;

    // Getter and Setter
}

class Truck extends Vehicle {
    private int loadCapacity;

    // Getter and Setter
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;

public class InheritanceSerialization {
    public static void main(String[] args) throws Exception {
        Vehicle car = new Car();
        ((Car) car).setSeatingCapacity(5);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(car);
        System.out.println(json);
    }
}
JSON Output:
{
  "type": "car",
  "brand": "Toyota",
  "seatingCapacity": 5
}

4. Circular Reference Handling (Parent-Child Relationship)

Circular Reference সমস্যা সমাধানে Jackson @JsonManagedReference এবং @JsonBackReference ব্যবহার করতে সাহায্য করে। এর মাধ্যমে Parent-Child রিলেশনশিপ সঠিকভাবে JSON-এ serialize করা যায় এবং Infinite Loop এড়ানো যায়।

উদাহরণ:
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Parent {
    private String name;

    @JsonManagedReference
    private Child child;

    // Getters and Setters
}

public class Child {
    private String name;

    @JsonBackReference
    private Parent parent;

    // Getters and Setters
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;

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

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

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

Jackson Annotations ব্যবহার করে Complex Object Serialization এবং Deserialization

Jackson অ্যানোটেশনগুলি Complex Objects কে সহজেই JSON ফরম্যাটে রূপান্তর করতে সাহায্য করে। নিচে কিছু গুরুত্বপূর্ণ অ্যানোটেশনের ব্যবহার দেখানো হয়েছে:

  • @JsonProperty: JSON ফিল্ডের নাম পরিবর্তন।
  • @JsonManagedReference এবং @JsonBackReference: Circular Reference সমাধান।
  • @JsonTypeInfo এবং @JsonSubTypes: Polymorphic Serialization।
  • @JsonFormat: Date/Time ফরম্যাট কাস্টমাইজ করা।
  • @JsonCreator: Constructor-based Deserialization।
  • @JsonIgnore: JSON Serialization/Deserialization থেকে কিছু ফিল্ড বাদ দেওয়া।

  1. Jackson-এর Complex Object Serialization এবং Deserialization শক্তিশালী এবং নমনীয়।
  2. @JsonTypeInfo, @JsonManagedReference, @JsonSubTypes, এবং অন্যান্য অ্যানোটেশন ব্যবহার করে আপনি JSON ফিল্ড নিয়ন্ত্রণ এবং Complex Objects এর মধ্যে সম্পর্ক ম্যানেজ করতে পারেন।
  3. এই অ্যানোটেশনগুলির মাধ্যমে Polymorphism, Circular References, এবং Nested Object-গুলির JSON Representation সঠিকভাবে হ্যান্ডেল করা যায়।
Content added By

Practical উদাহরণ সহ @JsonUnwrapped এর ব্যবহার

289

@JsonUnwrapped Jackson এর একটি শক্তিশালী অ্যানোটেশন, যা nested objects বা complex objects কে একত্রে একটি ফ্ল্যাট JSON ফরম্যাটে রূপান্তর করতে ব্যবহৃত হয়। সাধারণত, যখন আপনি একটি জটিল অবজেক্টকে JSON-এ রূপান্তর করেন, তখন এটি একটি nested structure তৈরি করে। কিন্তু @JsonUnwrapped ব্যবহার করলে, আপনি এই nested অবজেক্টের ফিল্ডগুলোকে সরাসরি parent object-এর মধ্যে যুক্ত করতে পারবেন।


@JsonUnwrapped এর ব্যবহার

  • Flattening Nested Objects: Nested অবজেক্টগুলোকে parent object-এর ফিল্ডের মতো একটি সমতল (flat) structure-এ JSON-এ পরিবর্তন করতে।
  • Serialization: Nested অবজেক্টের সমস্ত ফিল্ড parent object-এ একত্রিত হয়ে JSON আউটপুট তৈরি হয়।
  • Deserialization: JSON থেকে nested অবজেক্টের সমস্ত ফিল্ড parent object-এর মধ্যে সঠিকভাবে মাপা হয়।

প্রথম উদাহরণ: Basic @JsonUnwrapped

ক্লাস তৈরি করা:

import com.fasterxml.jackson.annotation.JsonUnwrapped;

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

    // Constructors, Getters and Setters
    public Address(String street, String city, String state) {
        this.street = street;
        this.city = city;
        this.state = state;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

Parent ক্লাস (Person) তৈরি করা:

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

    @JsonUnwrapped
    private Address address;

    // Constructors, Getters and Setters
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("1234 Elm St", "Springfield", "IL");
        Person person = new Person("John Doe", 30, address);

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

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "John Doe",
  "age": 30,
  "street": "1234 Elm St",
  "city": "Springfield",
  "state": "IL"
}

ব্যাখ্যা:

  • এখানে, Address ক্লাসটি Person ক্লাসের একটি ফিল্ড হিসেবে থাকে।
  • @JsonUnwrapped ব্যবহার করা হয়েছে Person ক্লাসের address ফিল্ডের উপরে।
  • Address ক্লাসের সমস্ত ফিল্ডগুলো সরাসরি Person JSON অবজেক্টের মধ্যে যোগ হয়ে গেছে। ফলে, street, city, এবং state ফিল্ডগুলো nested structure হিসেবে না গিয়ে, flat structure হিসেবে রয়েছে।

দ্বিতীয় উদাহরণ: @JsonUnwrapped with Nested Objects

Address Class (এবার, এটি আরও জটিল হতে পারে):

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

    // Constructors, Getters, Setters
    public Address(String street, String city, String state, String zipCode) {
        this.street = street;
        this.city = city;
        this.state = state;
        this.zipCode = zipCode;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
}

Person Class:

import com.fasterxml.jackson.annotation.JsonUnwrapped;

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

    @JsonUnwrapped
    private Address address;

    // Constructors, Getters, Setters
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUnwrappedExample {
    public static void main(String[] args) throws Exception {
        Address address = new Address("1234 Elm St", "Springfield", "IL", "62704");
        Person person = new Person("John Doe", 30, address);

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

        System.out.println(json);
    }
}
JSON Output:
{
  "name": "John Doe",
  "age": 30,
  "street": "1234 Elm St",
  "city": "Springfield",
  "state": "IL",
  "zipCode": "62704"
}

@JsonUnwrapped এর অন্যান্য ব্যবহার:

Nested Object Unwrapping in a Collection

@JsonUnwrapped ব্যবহার করে আপনি একটি Collection বা List এর মধ্যে থাকা nested অবজেক্টগুলোর ফিল্ডগুলোও একত্রে ফ্ল্যাট JSON-এ রূপান্তর করতে পারেন।

Example:

import com.fasterxml.jackson.annotation.JsonUnwrapped;
import java.util.List;

public class Company {
    private String name;

    @JsonUnwrapped
    private List<Person> employees;

    // Constructors, Getters, Setters
}

এখানে, employees লিস্টের মধ্যে থাকা Person অবজেক্টের সমস্ত ফিল্ড flattened হয়ে যাবে JSON-এ।


@JsonUnwrapped এর সুবিধা:

  1. Flattening Nested Objects:
    • Nested অবজেক্টগুলোকে সরাসরি parent object-এর অংশ হিসেবে একত্রিত করে একটি সমতল JSON তৈরি করা যায়।
  2. Simplified Structure:
    • JSON ডেটা আরও সহজ এবং সংক্ষিপ্ত হয়, যা API-র জন্য আরও ব্যবহারকারী-বান্ধব।
  3. Flexible Serialization:
    • Nested objects-এ ফিল্ডগুলোর মধ্যে ফ্ল্যাট স্ট্রাকচার সুবিধার জন্য উপকারী, যেখানে nested structure প্রয়োজন নেই।

  • @JsonUnwrapped একটি শক্তিশালী অ্যানোটেশন যা nested objects কে সরাসরি parent object-এ একত্রিত করে JSON-এ রূপান্তর করতে সাহায্য করে।
  • এটি JSON-এ স্ট্রাকচার সহজ এবং ফ্ল্যাট করে তোলে, যা API বা ডেটা এক্সচেঞ্জের জন্য কার্যকর।
  • Nested objects সমন্বিত JSON তৈরির জন্য এই অ্যানোটেশন ব্যবহারের ফলে কোড এবং ডেটা আরও পরিষ্কার এবং পারফরম্যান্সের জন্য উপযোগী হয়ে ওঠে।
Content added By
Promotion

Are you sure to start over?

Loading...