@JsonFilter এবং Dynamic Filtering গাইড ও নোট

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

@JsonFilter হল একটি Jackson অ্যানোটেশন যা ডায়নামিক JSON ফিল্টারিংয়ের জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি JSON ডেটার ফিল্ডগুলো কাস্টম কন্ডিশন অনুযায়ী filter বা exclude করতে পারেন, যা runtime-এ নির্ধারিত হয়। এটি বিশেষভাবে কার্যকর যখন আপনি চাইবেন যে কিছু নির্দিষ্ট শর্তে JSON এর কিছু ফিল্ড প্রদর্শন বা বাদ দেওয়া হোক।


@JsonFilter এর ব্যবহার

Jackson-এ Dynamic Filtering সাধারণত ObjectMapper এর সাথে FilterProvider এবং SimpleBeanPropertyFilter ব্যবহার করে কনফিগার করা হয়।

প্রাথমিক উদাহরণ:

  1. @JsonFilter অ্যানোটেশন ব্যবহার করে ক্লাসে একটি ফিল্টার অ্যাসাইন করা হয়।
  2. SimpleBeanPropertyFilter ব্যবহার করে নির্দিষ্ট প্রপার্টি গুলি ইনক্লুড বা এক্সক্লুড করা হয়।
  3. FilterProvider ব্যবহার করে ফিল্টার সেট করা হয় ObjectMapper-এ।

Step-by-step Example:

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

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("personFilter")  // Apply filter on Person class
public class Person {
    private String name;
    private int age;
    private String email;

    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // 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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

2. ObjectMapper এ Filter সেট করা:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.filter.FilterProvider;
import com.fasterxml.jackson.databind.ser.filter.SimpleFilterProvider;

public class JsonFilterExample {
    public static void main(String[] args) throws Exception {
        Person person = new Person("John Doe", 30, "john.doe@example.com");

        // Create an ObjectMapper instance
        ObjectMapper objectMapper = new ObjectMapper();

        // Create a filter to include only 'name' and 'age' properties
        FilterProvider filters = new SimpleFilterProvider().addFilter("personFilter", 
            SimpleBeanPropertyFilter.filterOutAllExcept("name", "age"));

        // Serialize the object with the filter applied
        String json = objectMapper.writer(filters).writeValueAsString(person);
        System.out.println("Filtered JSON: " + json);
    }
}

Output:

{
  "name": "John Doe",
  "age": 30
}

ব্যাখ্যা:

  1. @JsonFilter("personFilter"): এটি Person ক্লাসে একটি ফিল্টার নাম personFilter অ্যাসাইন করেছে, যা JSON ফিল্টারিং এর জন্য ব্যবহার হবে।
  2. SimpleBeanPropertyFilter.filterOutAllExcept("name", "age"): এই ফিল্টার শুধুমাত্র name এবং age ফিল্ডগুলো JSON আউটপুটে রাখবে এবং অন্য কোনো ফিল্ড বাদ দিয়ে দেবে।
  3. FilterProvider: ফিল্টারটি ObjectMapper এ যোগ করা হয়েছে যাতে JSON Serialization এর সময় এটি কার্যকর হয়।

Dynamic Filtering with Multiple Filters

1. Multiple Filters Example:

আপনি একাধিক ফিল্টার তৈরি করতে পারেন এবং বিভিন্ন ফিল্ডের জন্য কাস্টম ফিল্টারিং প্রয়োগ করতে পারেন।

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.filter.FilterProvider;
import com.fasterxml.jackson.databind.ser.filter.SimpleFilterProvider;

public class MultipleFiltersExample {
    public static void main(String[] args) throws Exception {
        Person person = new Person("Jane Doe", 25, "jane.doe@example.com");

        // Create an ObjectMapper instance
        ObjectMapper objectMapper = new ObjectMapper();

        // Create a filter to include only 'name' and 'email' properties
        FilterProvider filters = new SimpleFilterProvider()
            .addFilter("personFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name", "email"))
            .addFilter("anotherFilter", SimpleBeanPropertyFilter.filterOutAllExcept("age"));

        // Serialize the object with the filter applied
        String json = objectMapper.writer(filters).writeValueAsString(person);
        System.out.println("Filtered JSON: " + json);
    }
}

Output:

{
  "name": "Jane Doe",
  "email": "jane.doe@example.com"
}
  • এখানে, দুটি ফিল্টার ব্যবহৃত হয়েছে, একটি name এবং email ফিল্ডের জন্য এবং অন্যটি age ফিল্ডের জন্য।

Use Cases for @JsonFilter and Dynamic Filtering

  1. Sensitive Data: JSON থেকে সংবেদনশীল তথ্য (যেমন পাসওয়ার্ড, ক্রেডেনশিয়াল) Dynamic Filtering এর মাধ্যমে নিরাপদে সরানো।
  2. API Responses: API responses কাস্টমাইজ করতে, যেমন শুধুমাত্র প্রয়োজনীয় ডেটা ফিরিয়ে দেওয়া।
  3. Role-Based Access Control (RBAC): ব্যবহারকারীর ভূমিকা অনুযায়ী কিছু ডেটা ফিল্টার করা, যেমন একজন সাধারণ ব্যবহারকারী শুধুমাত্র পাবলিক তথ্য দেখতে পাবে।

@JsonFilter এর সুবিধা

  1. Dynamic Control: JSON ফিল্ডগুলিকে কাস্টম কন্ডিশন অনুযায়ী Filter করা সম্ভব।
  2. Reusability: একই Filter পুনঃব্যবহার করা যায়।
  3. Flexibility: কোনো প্রকার hardcoding ছাড়াই runtime-এ ফিল্ডগুলো এক্সক্লুড বা ইনক্লুড করা যায়।

  • @JsonFilter এবং Dynamic Filtering Jackson-এ JSON ফিল্ড গুলি কাস্টম কন্ডিশন অনুযায়ী ইনক্লুড বা এক্সক্লুড করার জন্য শক্তিশালী টুল।
  • এটি API গুলোর জন্য বিশেষভাবে কার্যকর, যেখানে আপনি runtime-এ ডেটা ফিল্টার করতে চান বা সিকিউরিটি এবং পারফরম্যান্স অপটিমাইজেশন করতে চান।
  • @JsonFilter খুবই কার্যকর যখন আপনি বড় এবং জটিল JSON অবজেক্টের অংশগুলি কাস্টমাইজ করতে চান।
Content added By

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

316

@JsonFilter Jackson-এর একটি অ্যানোটেশন, যা JSON Serialization-এর সময় dynamic filtering এর জন্য ব্যবহৃত হয়। এটি বিশেষভাবে উপকারী যখন আপনি একটি Java Object থেকে JSON তৈরি করার সময় নির্দিষ্ট কিছু ফিল্ড বা প্রোপার্টি ফিল্টার করতে চান, তবে ঐ Object এর অন্যান্য ফিল্ডগুলো থাকতে চাই। অর্থাৎ, আপনি কোনো নির্দিষ্ট ফিল্ডকে JSON আউটপুট থেকে অন্তর্ভুক্ত বা বাদ দিতে পারেন।

@JsonFilter অ্যানোটেশনটি একটি filter id যুক্ত করে, যা পরে Jackson ObjectMapper দ্বারা ব্যবহৃত হয়। এই filter-id-এর মাধ্যমে আপনি Jackson ObjectMapper-এ filter সেট করতে পারেন, এবং নির্দিষ্ট ফিল্ডগুলোকে JSON এ অন্তর্ভুক্ত বা বাদ দিতে পারেন।


@JsonFilter এর সাধারণ ব্যবহার

  1. Dynamic Filtering:
    • আপনাকে একটি অবজেক্টের নির্দিষ্ট ফিল্ডের জন্য কাস্টম ফিল্টারিং করতে সাহায্য করে।
  2. Filter Configuration:
    • Jackson ObjectMapper-এর মাধ্যমে Filter ID সেট করা হয় এবং নির্দিষ্ট ফিল্ডগুলো অন্তর্ভুক্ত বা বাদ দেওয়ার জন্য ফিল্টার অ্যাপ্লাই করা হয়।

@JsonFilter এর উদাহরণ

১. @JsonFilter এর মাধ্যমে dynamic filtering

Step 1: প্রথমে একটি Java ক্লাসে @JsonFilter অ্যানোটেশন যুক্ত করুন।

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("myFilter")
public class User {
    private int id;
    private String name;
    private String email;

    // Constructor
    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Step 2: ObjectMapper-এ filter-টি কনফিগার করুন এবং ফিল্টারিং অ্যাপ্লাই করুন।

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

public class JsonFilterExample {
    public static void main(String[] args) throws Exception {
        // Sample User Object
        User user = new User(1, "Rahim", "rahim@example.com");

        // ObjectMapper তৈরি
        ObjectMapper mapper = new ObjectMapper();

        // Filter Provider তৈরি এবং Filter ID অ্যাসাইন করা
        SimpleFilterProvider filters = new SimpleFilterProvider();
        filters.addFilter("myFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id", "name"));

        // Filter অ্যাপ্লাই করা
        String json = mapper.writer(filters).writeValueAsString(user);

        System.out.println("Filtered JSON: " + json);
    }
}

Output:

{
  "id": 1,
  "name": "Rahim"
}

এখানে, @JsonFilter("myFilter") ব্যবহৃত হয়েছে। ObjectMapper-এ filter applied হয়েছে, যা শুধু id এবং name ফিল্ড JSON আউটপুটে অন্তর্ভুক্ত করবে, এবং email ফিল্ড বাদ দেয়া হয়েছে।


@JsonFilter এর মূল বৈশিষ্ট্য:

  1. Dynamic Field Inclusion/Exclusion:
    • JSON এর ক্ষেত্রে নির্দিষ্ট ফিল্ড বাদ দেওয়া বা অন্তর্ভুক্ত করা খুব সহজে করা যায়।
  2. Filter Configuration with ObjectMapper:
    • Jackson এর ObjectMapper এবং SimpleFilterProvider ব্যবহার করে ফিল্টার কনফিগার করা হয়।
  3. Flexible Filtering:
    • আপনি একাধিক ফিল্টার কনফিগার করে আলাদা আলাদা ফিল্টারিং পদ্ধতি প্রয়োগ করতে পারেন।

@JsonFilter vs @JsonIgnore / @JsonIgnoreProperties

বৈশিষ্ট্য@JsonFilter@JsonIgnore / @JsonIgnoreProperties
প্রধান উদ্দেশ্যDynamic filtering at runtimeStatic exclusion at compile time
ব্যবহারFilter JSON properties dynamically at runtimeExclude properties from JSON at compile time
ফিল্টারিংয়ের সময়Flexible and dynamic filteringStatic filtering, can't change at runtime
কনফিগারেশনCan be applied via SimpleFilterProviderApplied directly to fields or class

@JsonFilter এর অন্যান্য সুবিধা

  1. JSON ডেটা Filtering:
    • কাস্টম filter ব্যবহার করে JSON এর বিভিন্ন প্রোপার্টি (যেমন: sensitive data) নিরাপদে বাদ দেয়া যায়।
  2. API Compatibility:
    • যখন আপনার API ভিন্ন JSON ফরম্যাট গ্রহণ করে, তখন আপনি সহজেই ডেটা কাস্টমাইজ করতে পারেন।
  3. Performance:
    • বড় JSON ডেটা প্রসেস করার সময় শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো প্রসেস করে কর্মক্ষমতা বৃদ্ধি করা যায়।

  1. @JsonFilter অ্যানোটেশনটি Jackson এর মধ্যে dynamic field filtering এর জন্য খুবই কার্যকর। এটি JSON ডেটা কাস্টমাইজেশনের জন্য খুবই সুবিধাজনক।
  2. এটি serialization এবং deserialization সময় কাস্টমフィল্টারিং ব্যবস্থা গ্রহণ করতে সাহায্য করে, যেখানে আপনি প্রয়োজনীয় ফিল্ডগুলো অন্তর্ভুক্ত বা বাদ দিতে পারেন।
  3. SimpleFilterProvider এবং SimpleBeanPropertyFilter এর মাধ্যমে Jackson ObjectMapper-এ filter কনফিগার করা যায়, এবং সেক্ষেত্রে বিভিন্ন অবজেক্টের জন্য নির্দিষ্ট ফিল্ড ফিল্টারিং করা সম্ভব হয়।
Content added By

Custom Filters তৈরি এবং ব্যবহার

318

Jackson Annotations: Custom Filters তৈরি এবং ব্যবহার

Jackson Custom Filters ব্যবহার করা হয় JSON Serialization এবং Deserialization এর সময় ডেটার নির্দিষ্ট অংশ ফিল্টার করার জন্য। এটি বিশেষভাবে উপকারী যখন আপনি JSON আউটপুট থেকে কিছু ফিল্ড বা প্রোপার্টি বাদ দিতে চান বা শুধুমাত্র নির্দিষ্ট অংশগুলো প্রসেস করতে চান।

Jackson এ custom filters তৈরি করতে @JsonFilter অ্যানোটেশন এবং SimpleFilterProvider ব্যবহার করা হয়। এই প্রক্রিয়াটি বিশেষত ডাইনামিকভাবে JSON ফিল্ডগুলোর উপস্থিতি নিয়ন্ত্রণ করতে কার্যকর।


Jackson এ Custom Filters তৈরি করার প্রক্রিয়া

ধাপ ১: @JsonFilter অ্যানোটেশন ব্যবহার

  • @JsonFilter অ্যানোটেশনটি Jackson কে জানায় যে ফিল্টারিং এর জন্য কোন ফিল্টার অ্যাপ্লাই করা হবে।

ধাপ ২: SimpleFilterProvider ব্যবহার

  • SimpleFilterProvider ব্যবহার করে আপনি নির্দিষ্ট ফিল্টার সেট করতে পারেন এবং ObjectMapper-এ সেট করতে পারেন।

Custom Filters তৈরি এবং ব্যবহার করার উদাহরণ

1. Custom Filter তৈরি

ধরা যাক, আমাদের একটি User ক্লাস রয়েছে এবং আমরা চাই JSON Serialization-এ password ফিল্ডটিকে ফিল্টার (অথবা বাদ) করতে।

Java Class Example:

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("userFilter")
public class User {
    private int id;
    private String name;
    private String password;

    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2. Filter সেট করা এবং ObjectMapper ব্যবহার করা

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.FilterProvider;

public class CustomFilterExample {
    public static void main(String[] args) throws Exception {
        User user = new User(1, "Rahim", "secretPassword");

        // ObjectMapper তৈরি এবং filter সেট করা
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider().addFilter("userFilter", 
            SimpleBeanPropertyFilter.serializeAllExcept("password"));
        
        // Filtered JSON Serialization
        String json = mapper.writer(filters).writeValueAsString(user);
        System.out.println(json);  // password ফিল্টার হয়ে যাবে
    }
}

Output:

{
  "id": 1,
  "name": "Rahim"
}

এখানে, SimpleBeanPropertyFilter.serializeAllExcept("password") ব্যবহার করা হয়েছে, যা password ফিল্ডটিকে বাদ দেয় এবং বাকি সব ফিল্ড JSON-এ সংরক্ষণ করে।


SimpleFilterProvider এবং SimpleBeanPropertyFilter এর মাধ্যমে আরও কাস্টমাইজেশন

Jackson-এ আরও কাস্টম ফিল্টার তৈরি করতে, আপনি SimpleBeanPropertyFilter এর সাহায্যে নির্দিষ্ট প্রোপার্টি বা শর্ত অনুযায়ী ফিল্টার করতে পারেন।

3. Serialize Only Specific Fields

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

public class CustomFilterExample {
    public static void main(String[] args) throws Exception {
        User user = new User(1, "Rahim", "secretPassword");

        // ObjectMapper তৈরি এবং filter সেট করা
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider().addFilter("userFilter", 
            SimpleBeanPropertyFilter.filterOutAllExcept("id", "name"));
        
        // Filtered JSON Serialization
        String json = mapper.writer(filters).writeValueAsString(user);
        System.out.println(json);  // শুধু id এবং name ফিল্ডগুলো থাকবে
    }
}

Output:

{
  "id": 1,
  "name": "Rahim"
}

এখানে, SimpleBeanPropertyFilter.filterOutAllExcept("id", "name") ব্যবহার করা হয়েছে, যা password ফিল্ড বাদ দিয়ে শুধু id এবং name ফিল্ডগুলো JSON-এ সেরিয়ালাইজ করবে।


4. Complex Filters with Dynamic Criteria

Jackson ফিল্টারিংয়ের মাধ্যমে আপনি আরও জটিল শর্তও নির্ধারণ করতে পারেন, যেমন শুধুমাত্র নির্দিষ্ট টাইপের অবজেক্টের জন্য ফিল্টার প্রয়োগ করা।

Example of Conditional Filtering:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

public class ConditionalFilteringExample {
    public static void main(String[] args) throws Exception {
        User user = new User(1, "Rahim", "secretPassword");

        // Condition: Only serialize 'password' if 'name' is "Rahim"
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider().addFilter("userFilter", 
            SimpleBeanPropertyFilter.filterOutAllExcept("id", "name", "password"));
        
        // Filtered JSON Serialization
        String json = mapper.writer(filters).writeValueAsString(user);
        System.out.println(json);  // Custom condition filtering
    }
}

@JsonFilter এবং SimpleFilterProvider এর মধ্যে পার্থক্য

বৈশিষ্ট্য@JsonFilterSimpleFilterProvider
প্রয়োগের উদ্দেশ্যJSON ডেটা ফিল্টার করার জন্য ফিল্টার নির্ধারণ করাডাইনামিকভাবে ফিল্টার কনফিগারেশন এবং ফিল্টারদের সংজ্ঞায়িত করা
ব্যবহারসরাসরি ক্লাসের উপর ফিল্টার ব্যবহৃত হয়ObjectMapper এর সাথে ফিল্টার অ্যাপ্লাই করা হয়
ডায়নামিক ফিল্টারিংফিল্টার আগেই নির্ধারিত থাকে, তবে Dynamic ক্ষেত্রের জন্য SimpleFilterProvider প্রয়োজন হতে পারেডাইনামিক শর্ত এবং একাধিক ফিল্টারের জন্য উপযোগী

  1. Jackson Custom Filters JSON Serialization এবং Deserialization-এর সময় অজানা বা অপ্রয়োজনীয় ফিল্ডগুলো ফিল্টার করতে ব্যবহার করা হয়।
  2. @JsonFilter এবং SimpleFilterProvider এর মাধ্যমে Jackson এ কাস্টম ফিল্টার তৈরি ও প্রয়োগ করা হয়।
  3. Dynamic Filtering ব্যবহার করে আপনি চলমান ডেটার উপর শর্ত ভিত্তিক ফিল্টার প্রয়োগ করতে পারেন।

Jackson এ Custom Filters দিয়ে আপনি JSON আউটপুট বা ইনপুটকে আরও নিয়ন্ত্রণযোগ্য এবং কাস্টমাইজড করতে পারেন, যা বড় প্রকল্পে ফিল্ড ম্যানিপুলেশন এবং নিরাপত্তা নিশ্চিত করতে সাহায্য করে।

Content added By

Serialization এর সময় Dynamic Filtering কনফিগার করা

282

Jackson-এর Dynamic Filtering একটি শক্তিশালী বৈশিষ্ট্য যা ব্যবহারকারীদের JSON Serialization প্রক্রিয়া চলাকালীন কনফিগারযোগ্যভাবে নির্দিষ্ট ফিল্ডগুলোর অন্তর্ভুক্তি বা বাদ দেওয়ার সুযোগ দেয়। এর মাধ্যমে, নির্দিষ্ট সময়ে (যেমন, API কলের সময়ে) কোন ফিল্ডগুলো JSON-এ অন্তর্ভুক্ত করা হবে তা নির্ধারণ করা যায়।

Jackson-এ Dynamic Filtering করার জন্য @JsonFilter এবং FilterProvider ব্যবহৃত হয়।


Dynamic Filtering-এর প্রয়োজনীয়তা

Dynamic Filtering প্রয়োজন হয় যখন:

  1. আপনি কিছু ফিল্ড সাধারণত JSON আউটপুটে অন্তর্ভুক্ত করতে চান, তবে কিছু ক্ষেত্রে সেগুলি বাদ দিতে চান।
  2. আপনি একটি একক ক্লাসের উপর বিভিন্ন ধরনের ফিল্টার প্রয়োগ করতে চান নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে।
  3. আপনি field-based বা attribute-based filter প্রয়োগ করতে চান।

@JsonFilter Annotation

@JsonFilter অ্যানোটেশনটি Jackson এর মধ্যে ফিল্টার ব্যবস্থাপনা করতে ব্যবহৃত হয়। এটি একটি নাম নির্ধারণ করে, যা পরে JSON সিরিয়ালাইজেশনের সময় নির্দিষ্ট ফিল্ডকে include বা exclude করার জন্য ব্যবহৃত হয়।

ধাপ ১: @JsonFilter ব্যবহার করা

  1. @JsonFilter অ্যানোটেশনটি ক্লাসে ব্যবহার করা হয়।
  2. ফিল্টারের নাম নির্ধারণ করতে হয়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("userFilter")
public class User {
    private int id;
    private String name;
    private String email;
    
    // Constructors
    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    
    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  • এখানে, User ক্লাসে @JsonFilter("userFilter") অ্যানোটেশন ব্যবহার করা হয়েছে, যা পরে ফিল্টার প্রয়োগ করার সময় ব্যবহার করা হবে।

ধাপ ২: SimpleBeanPropertyFilter এবং FilterProvider ব্যবহার করে Dynamic Filtering কনফিগার করা

Jackson-এ Dynamic Filtering বাস্তবায়ন করতে, আপনাকে SimpleBeanPropertyFilter এবং FilterProvider ব্যবহার করতে হবে। এই দুটি ক্লাস ফিল্টার কনফিগার করতে ব্যবহৃত হয়।

কোড উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

public class DynamicFilteringExample {
    public static void main(String[] args) throws Exception {
        User user = new User(1, "John Doe", "john.doe@example.com");

        // Create ObjectMapper instance
        ObjectMapper mapper = new ObjectMapper();

        // Create the filter
        SimpleFilterProvider filters = new SimpleFilterProvider();
        filters.addFilter("userFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id", "name"));

        // Apply the filter during serialization
        String json = mapper.writer(filters).writeValueAsString(user);

        // Print JSON output
        System.out.println(json);
    }
}

JSON Output (with dynamic filtering):

{
  "id": 1,
  "name": "John Doe"
}

ব্যাখ্যা:

  • SimpleBeanPropertyFilter.filterOutAllExcept("id", "name") ব্যবহার করে User অবজেক্টের id এবং name ফিল্ডগুলিকে JSON আউটপুটে অন্তর্ভুক্ত করা হয়েছে এবং email ফিল্ডটি বাদ দেওয়া হয়েছে।
  • @JsonFilter("userFilter") এর মাধ্যমে ফিল্টারের নাম userFilter নির্ধারণ করা হয়েছে এবং এটি SimpleFilterProvider এর সাথে সংযুক্ত করা হয়েছে।

@JsonFilter এর অন্য সুবিধা

  1. Field Level Filtering:
    • @JsonFilter অ্যানোটেশনটি ব্যবহার করে আপনার ক্লাসে সব ফিল্ডের উপর dynamic filtering প্রয়োগ করা যায়, যা runtime-এ নির্ধারণ করা হয়।
  2. Runtime Filtering:
    • ফিল্টারটি runtime-এ নির্ধারণ করতে পারবেন, যা বিশেষ পরিস্থিতিতে ব্যবহৃত হতে পারে (যেমন, API কলের ভিত্তিতে নির্দিষ্ট ফিল্ডের প্রয়োজনীয়তা)।
  3. Multiple Filters:
    • আপনি একাধিক ফিল্টার কনফিগার করতে পারেন এবং প্রয়োজনে একাধিক ফিল্টারের সাথে কাজ করতে পারবেন। Jackson ফিল্টার ব্যবস্থাপনায় কাস্টম ফিল্টারিং সহজভাবে তৈরি করা সম্ভব।

Spring Boot এ Dynamic Filtering

Spring Boot এ Dynamic Filtering ব্যবহারের জন্য @JsonFilter অ্যানোটেশন এবং FilterProvider ব্যবহার করতে পারেন। Spring REST Controller-এ ফিল্টারিং করা যাবে।

Spring Boot Controller Example:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user")
    public String getUser() throws Exception {
        User user = new User(1, "John Doe", "john.doe@example.com");

        // Create ObjectMapper instance
        ObjectMapper mapper = new ObjectMapper();

        // Create the filter
        SimpleFilterProvider filters = new SimpleFilterProvider();
        filters.addFilter("userFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id", "name"));

        // Apply the filter during serialization
        return mapper.writer(filters).writeValueAsString(user);
    }
}

API Response (with dynamic filtering):

{
  "id": 1,
  "name": "John Doe"
}

@JsonFilter এবং @JsonIgnore এর মধ্যে পার্থক্য

বৈশিষ্ট্য@JsonFilter@JsonIgnore
ব্যবহারDynamic Filtering (Runtime Control)স্ট্যাটিকভাবে ফিল্ড বা প্রপার্টি বাদ দেওয়ার জন্য
ফিল্ড লেভেলহ্যাঁ, এটি ম্যানুয়ালি কনফিগার করা যায়সরাসরি কোনো ফিল্ডে প্রয়োগ করা যায়
ফিল্টারিং কনফিগারেশনফিল্টার Provider দিয়ে কাস্টম কনফিগার করা হয়সরাসরি @JsonIgnore দ্বারা বাদ দেওয়া হয়

  • Dynamic Filtering Jackson-এর একটি শক্তিশালী বৈশিষ্ট্য যা runtime-এ JSON ফিল্ডের অন্তর্ভুক্তি বা বাদ দেওয়ার সক্ষমতা প্রদান করে।
  • @JsonFilter অ্যানোটেশন এবং SimpleBeanPropertyFilter এর সাহায্যে নির্দিষ্ট ফিল্ডগুলোকে বাদ বা অন্তর্ভুক্ত করা যায়।
  • FilterProvider ব্যবহার করে ফিল্টার কনফিগারেশন নিয়ন্ত্রণ করা সম্ভব।
  • Spring Boot-এ @JsonFilter ব্যবহার করে API-তে dynamic JSON filtering সহজভাবে করা যায়।
Content added By

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

279

@JsonFilter Jackson-এর একটি শক্তিশালী অ্যানোটেশন, যা JSON Serialization এবং Deserialization এর সময় ডেটা ফিল্টার করতে ব্যবহৃত হয়। এটি আপনাকে নির্দিষ্ট ডেটা প্রক্রিয়া করার সময় ডাইনামিকভাবে ফিল্টার প্রয়োগ করতে সাহায্য করে, যা বিশেষ করে নির্দিষ্ট কন্ডিশন বা সিকিউরিটি ও পেরফরম্যান্স চাহিদা পূরণের জন্য উপকারী হতে পারে।

Jackson-এ @JsonFilter অ্যানোটেশন ব্যবহার করে আপনি dynamic filtering করতে পারেন, যেখানে আপনি Java অবজেক্টের নির্দিষ্ট প্রোপার্টি বা ফিল্ডগুলোকে ফিল্টার করে JSON রূপান্তর করতে পারেন।

@JsonFilter এর সুবিধা

  1. Dynamic Filtering: Serialization-এর সময় কোন ফিল্ডগুলিকে JSON-এ অন্তর্ভুক্ত করা হবে তা নিয়ন্ত্রণ করা যায়।
  2. Runtime Filtering: ফিল্টারিং প্রক্রিয়া রানটাইমে নির্ধারণ করা যায়, অর্থাৎ যেকোনো সময় আপনাকে ফিল্টার অ্যাপ্লাই করার ক্ষমতা দেয়।
  3. Selective Serialization: শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো JSON-এ অন্তর্ভুক্ত করা হয়।

@JsonFilter ব্যবহারের প্রক্রিয়া

@JsonFilter ব্যবহারের জন্য নিচের ধাপগুলো অনুসরণ করা হয়:

  1. Filter-ID নির্ধারণ করা: @JsonFilter অ্যাট্রিবিউট দিয়ে ফিল্টারের নাম নির্ধারণ করা হয়।
  2. ObjectMapper এ Filter প্রয়োগ করা: ObjectMapper-এ filter-এ যা-চাহিদা সেটিং যুক্ত করা হয়।

প্র্যাকটিক্যাল উদাহরণ

Step 1: @JsonFilter অ্যাট্রিবিউট ব্যবহার করে ক্লাসে ফিল্টার তৈরি

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("dynamicFilter")
public class Employee {
    private String name;
    private String department;
    private int age;
    private double salary;

    // Constructors
    public Employee(String name, String department, int age, double salary) {
        this.name = name;
        this.department = department;
        this.age = age;
        this.salary = salary;
    }

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

    public String getDepartment() {
        return department;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }
}

এখানে, @JsonFilter("dynamicFilter") ফিল্টারের জন্য একটি নাম (dynamicFilter) নির্ধারণ করা হয়েছে। এর মানে, যখন আমরা ObjectMapper দিয়ে JSON সিরিয়ালাইজ করব, তখন dynamicFilter ফিল্টারটি অ্যাপ্লাই হবে।

Step 2: ObjectMapper এ Filter যুক্ত করা এবং Filter-এ নির্বাচন করা ফিল্ড

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;

public class JsonFilterExample {
    public static void main(String[] args) throws Exception {
        // Employee object তৈরি
        Employee employee = new Employee("Rahim", "Finance", 30, 50000.00);

        // ObjectMapper তৈরি
        ObjectMapper mapper = new ObjectMapper();

        // Filter Provider তৈরি
        SimpleFilterProvider filters = new SimpleFilterProvider();
        
        // Filter সেট করা
        filters.addFilter("dynamicFilter", 
            BeanPropertyFilter.serializeAllExcept("salary", "age")); // salary এবং age বাদ দেওয়া হয়েছে

        // Filter সহ JSON সিরিয়ালাইজ করা
        String json = mapper.writer(filters).writeValueAsString(employee);

        // JSON আউটপুট
        System.out.println(json);
    }
}

Step 3: Output

এখন, যখন JSON সিরিয়ালাইজ করা হবে, তখন salary এবং age ফিল্ডগুলি বাদ দেওয়া হবে, কারণ আমরা serializeAllExcept পদ্ধতি ব্যবহার করেছি।

JSON Output:
{
  "name": "Rahim",
  "department": "Finance"
}

এখানে শুধুমাত্র name এবং department ফিল্ডগুলো JSON আউটপুটে থাকবে, এবং salaryage ফিল্ডগুলো বাদ দেওয়া হয়েছে।


@JsonFilter এর অন্যান্য ব্যবহার

  1. serializeAllExcept:
    • নির্দিষ্ট কিছু ফিল্ড ছাড়া সব ফিল্ড সিরিয়ালাইজ করা হবে।
  2. serializeOnly:
    • নির্দিষ্ট কিছু ফিল্ডকে শুধুমাত্র সিরিয়ালাইজ করা হবে।
  3. Custom Filters:
    • আরও বেশি কাস্টম ফিল্টার তৈরি করতে BeanPropertyFilter এবং SimpleFilterProvider ব্যবহার করা হয়।

Custom Filter উদাহরণ:

import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ObjectMapper;

public class CustomFilterExample {
    public static void main(String[] args) throws Exception {
        // Employee object তৈরি
        Employee employee = new Employee("Sara", "HR", 28, 60000.00);

        // ObjectMapper তৈরি
        ObjectMapper mapper = new ObjectMapper();
        
        // Custom Filter: শুধু নাম এবং বিভাগ সিরিয়ালাইজ হবে
        SimpleFilterProvider filters = new SimpleFilterProvider();
        filters.addFilter("dynamicFilter", 
            BeanPropertyFilter.filterOutAllExcept("name", "department"));

        // Filter সহ JSON সিরিয়ালাইজ করা
        String json = mapper.writer(filters).writeValueAsString(employee);

        // JSON আউটপুট
        System.out.println(json);
    }
}
Output:
{
  "name": "Sara",
  "department": "HR"
}

এখানে, কাস্টম ফিল্টার ব্যবহার করে name এবং department ফিল্ডগুলো ছাড়া অন্য কোন ফিল্ড JSON আউটপুটে থাকবে না।


@JsonFilter এর সুবিধা

  1. Dynamic Filtering:
    • Serialization-এর সময় dynamicভাবে কোন ফিল্ড বা প্রোপার্টি JSON-এ অন্তর্ভুক্ত হবে বা বাদ যাবে তা নির্ধারণ করা যায়।
  2. Performance Optimization:
    • যখন বড় ডেটা স্ট্রাকচার থাকে, তখন শুধুমাত্র প্রয়োজনীয় ডেটা JSON-এ অন্তর্ভুক্ত করে পারফরম্যান্স উন্নত করা যায়।
  3. Security:
    • সিকিউরিটি উদ্দেশ্যে বা সংবেদনশীল তথ্য গোপন রাখার জন্য নির্দিষ্ট প্রোপার্টি বাদ দেয়া যায়।
  4. Flexible Serialization:
    • Runtime-এ আপনি নির্দিষ্ট ডেটা ফিল্টার করতে পারেন, যা JSON-এর আউটপুট কাস্টমাইজেশন এবং ব্যবহারের জন্য খুবই উপকারী।

@JsonFilter Jackson এর একটি শক্তিশালী টুল যা JSON Serialization এবং Deserialization-এর সময় dynamic filtering করতে সাহায্য করে। এটি ডেটা সিকিউরিটি, পারফরম্যান্স অপটিমাইজেশন এবং ফ্লেক্সিবল JSON আউটপুট তৈরিতে খুবই কার্যকর। এটি ব্যবহার করার মাধ্যমে আপনি Java ক্লাসের কিছু প্রোপার্টি বা ফিল্ড JSON আউটপুট থেকে বাদ দিতে বা নির্বাচন করতে পারেন, যা অনেক ক্ষেত্রেই প্রয়োজনীয় হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...