Gson দিয়ে আপনি JSON ডেটার exclusion strategy এবং property customization করতে পারেন। এর মাধ্যমে আপনি নির্দিষ্ট ফিল্ডগুলি JSON রূপান্তর প্রক্রিয়া থেকে বাদ দিতে পারেন, অথবা কাস্টম নেম বা কাস্টম আচরণ নির্ধারণ করতে পারেন।
এখানে Exclusion Strategy এবং JSON Property কাস্টমাইজেশন কিভাবে করা যায়, তা আলোচনা করা হলো।
১. Exclusion Strategy:
Exclusion Strategy ব্যবহার করে আপনি JSON সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন থেকে কিছু ফিল্ড বাদ দিতে পারেন। Gson দুটি প্রধান exclusion strategy সাপোর্ট করে:
@ExposeAnnotation: আপনি কোনো ফিল্ডের জন্য এই অ্যানোটেশন ব্যবহার করতে পারেন যা শুধুমাত্র সিরিয়ালাইজেশন বা ডিজিরিয়ালাইজেশন এর জন্য সক্ষম।- Custom Exclusion Strategy: Gson এর
ExclusionStrategyইন্টারফেস ব্যবহার করে কাস্টম exclusion তৈরি করা যায়, যাতে নির্দিষ্ট শর্তে ফিল্ড বাদ দেওয়া হয়।
১.১ @Expose Annotation ব্যবহার করে Exclusion:
@Expose অ্যানোটেশন দিয়ে আপনি ফিল্ডগুলো নির্বাচন করতে পারেন, যেগুলো সিরিয়ালাইজ ও ডিজিরিয়ালাইজ করার সময় অন্তর্ভুক্ত হবে।
Java Class Example with @Expose:
import com.google.gson.annotations.Expose;
public class Person {
@Expose
private String name;
@Expose
private int age;
private String password; // This field will be excluded
// 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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Gson Configuration with @Expose:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setPassword("secret123");
// GsonBuilder with Expose annotation
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // Excludes fields without @Expose
.create();
// Convert Person object to JSON
String json = gson.toJson(person);
System.out.println(json);
}
}
Output:
{
"name": "John",
"age": 30
}
এখানে password ফিল্ডটি exclude করা হয়েছে যেহেতু এটি @Expose অ্যানোটেশন দ্বারা চিহ্নিত হয়নি।
১.২ Custom Exclusion Strategy:
Custom Exclusion Strategy ব্যবহার করে আপনি আরও নিয়ন্ত্রিতভাবে কোন ফিল্ডগুলো JSON সিরিয়ালাইজেশন/ডিজিরিয়ালাইজেশন থেকে বাদ যাবে, তা নির্ধারণ করতে পারেন।
Custom Exclusion Example:
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class CustomExclusionStrategyExample {
public static void main(String[] args) {
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setPassword("secret123");
// Define a custom exclusion strategy to exclude all fields named "password"
ExclusionStrategy strategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getName().equals("password"); // Exclude "password" field
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false; // No class exclusion
}
};
// Gson with custom exclusion strategy
Gson gson = new GsonBuilder()
.setExclusionStrategies(strategy) // Apply custom exclusion strategy
.create();
// Convert Person object to JSON
String json = gson.toJson(person);
System.out.println(json);
}
}
Output:
{
"name": "John",
"age": 30
}
এখানে password ফিল্ডটি কাস্টম exclusion স্ট্র্যাটেজির মাধ্যমে বাদ দেওয়া হয়েছে।
২. JSON Property কাস্টমাইজেশন:
Gson দিয়ে JSON property কাস্টমাইজ করতে পারবেন যাতে JSON ফিল্ডের নাম Java ক্লাসের ফিল্ড নামের সাথে মেলে না। এর জন্য আপনি @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন।
Java Class with @SerializedName:
import com.google.gson.annotations.SerializedName;
public class Person {
@SerializedName("full_name")
private String name;
@SerializedName("years_old")
private int age;
private String password;
// 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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Gson with @SerializedName:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setPassword("secret123");
// Gson Object
Gson gson = new Gson();
// Convert Person object to JSON with custom property names
String json = gson.toJson(person);
System.out.println(json);
}
}
Output:
{
"full_name": "John",
"years_old": 30
}
এখানে name ফিল্ডটি full_name এবং age ফিল্ডটি years_old নামে JSON এ কনভার্ট হয়েছে কারণ আমরা @SerializedName অ্যানোটেশন ব্যবহার করেছি।
৩. Summary:
- Exclusion Strategy:
@Expose: এই অ্যানোটেশনটি ফিল্ডের জন্য ব্যবহার করুন যা শুধুমাত্র সিরিয়ালাইজেশন এবং ডিজিরিয়ালাইজেশন প্রক্রিয়ায় অন্তর্ভুক্ত হবে।- Custom Exclusion Strategy: আপনি
ExclusionStrategyইন্টারফেস দিয়ে কাস্টম exclusion তৈরি করতে পারেন এবং নির্দিষ্ট শর্তে ফিল্ড বাদ দিতে পারেন।
- JSON Property কাস্টমাইজেশন:
@SerializedName: ব্যবহার করে আপনি Java ক্লাসের ফিল্ড নাম এবং JSON ফিল্ড নামের মধ্যে পার্থক্য তৈরি করতে পারেন।
এভাবে Gson দিয়ে আপনি আপনার JSON ডেটার কাস্টমাইজেশন ও exclusion প্রয়োজনীয়তা সহজেই পূরণ করতে পারবেন।
Gson এর Exclusion Strategy হল একটি কাস্টম কৌশল যা নির্ধারণ করে কোন ফিল্ড বা প্রপার্টি গুলি JSON-এ সিরিয়ালাইজ (serialize) এবং ডেসেরিয়ালাইজ (deserialize) করা হবে না। এটি Gson এর সিরিয়ালাইজেশন এবং ডেসেরিয়ালাইজেশন প্রক্রিয়ায় নির্দিষ্ট ফিল্ড বা প্রপার্টি বাদ দিতে বা এক্সক্লুড করতে ব্যবহার করা হয়।
Exclusion Strategy মূলত ব্যবহৃত হয় যখন আপনি চান না কিছু নির্দিষ্ট ফিল্ড JSON ডেটার মধ্যে অন্তর্ভুক্ত হোক। উদাহরণস্বরূপ, কোনো নিরাপত্তার কারণে কিছু ফিল্ড (যেমন পাসওয়ার্ড) বাদ দেওয়া বা কোনো ফিল্ড যেগুলি আপনার প্রয়োজনে প্রয়োজন নেই, সেগুলি JSON রূপান্তরে বাদ দেওয়া।
Exclusion Strategy এর প্রকারভেদ
Gson এর Exclusion Strategy তে দুটি মূলভাবে ব্যবহৃত পদ্ধতি আছে:
ExclusionStrategyInterface@Exposeঅ্যানোটেশন
1. ExclusionStrategy Interface:
ExclusionStrategy ইন্টারফেস ব্যবহার করে আপনি কাস্টম কৌশল তৈরি করতে পারেন যা নির্ধারণ করবে কোন ফিল্ড JSON সিরিয়ালাইজ এবং ডেসেরিয়ালাইজ করার সময় এক্সক্লুড করা হবে। এটি দুটি মেথড সমর্থন করে:
shouldSkipField(FieldAttributes f): এই মেথডটি নির্ধারণ করে যে একটি নির্দিষ্ট ফিল্ড JSON ডেটার মধ্যে থাকবে কিনা।shouldSkipClass(Class<?> clazz): এই মেথডটি নির্ধারণ করে যে একটি নির্দিষ্ট ক্লাসের জন্য সিরিয়ালাইজেশন বা ডেসেরিয়ালাইজেশন করা হবে কিনা।
ExclusionStrategy ইন্টারফেসের ব্যবহার উদাহরণ:
Java Class (User):
class User {
String name;
int age;
String password;
public User(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
}
Custom ExclusionStrategy:
import com.google.gson.*;
import com.google.gson.FieldAttributes;
class PasswordExclusionStrategy implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
// Skip the 'password' field
return f.getName().equals("password");
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false; // Don't skip any class
}
}
Java Code (Using ExclusionStrategy):
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
User user = new User("Rahim", 30, "secretpassword");
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setExclusionStrategies(new PasswordExclusionStrategy());
Gson gson = gsonBuilder.create();
// Custom Serialization (Excluding 'password' field)
String json = gson.toJson(user);
System.out.println(json);
}
}
আউটপুট:
{"name":"Rahim","age":30}
এখানে password ফিল্ডটি JSON ডেটার মধ্যে অন্তর্ভুক্ত হয়নি, কারণ PasswordExclusionStrategy কাস্টম এক্সক্লুশন কৌশলটি ব্যবহার করা হয়েছে।
2. @Expose অ্যানোটেশন:
Gson-এ @Expose অ্যানোটেশন ব্যবহার করে আপনি নির্দিষ্ট ফিল্ডকে সিরিয়ালাইজ বা ডেসেরিয়ালাইজ করার জন্য এক্সপোজ করতে পারেন। যখন @Expose অ্যানোটেশন ব্যবহার করা হয়, তখন Gson শুধু সেই ফিল্ডগুলোকে সিরিয়ালাইজ করবে যেগুলিতে @Expose অ্যানোটেশন দেওয়া আছে, আর যেগুলিতে দেওয়া নেই, সেগুলিকে এক্সক্লুড করবে।
Java Class (User):
import com.google.gson.annotations.Expose;
class User {
@Expose
String name;
@Expose
int age;
// No @Expose annotation, so it will be excluded from JSON
String password;
public User(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
}
Java Code (Using @Expose):
import com.google.gson.*;
import com.google.gson.annotations.Expose;
public class Main {
public static void main(String[] args) {
User user = new User("Rahim", 30, "secretpassword");
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.excludeFieldsWithoutExposeAnnotation(); // Exclude fields without @Expose
Gson gson = gsonBuilder.create();
// Custom Serialization (Only exposed fields will be serialized)
String json = gson.toJson(user);
System.out.println(json);
}
}
আউটপুট:
{"name":"Rahim","age":30}
এখানে password ফিল্ডটি এক্সক্লুড হয়েছে কারণ এতে @Expose অ্যানোটেশন দেওয়া হয়নি।
Exclusion Strategy কেন ব্যবহার করা হয়?
Exclusion Strategy ব্যবহার করার কিছু গুরুত্বপূর্ণ কারণ হলো:
- নিরাপত্তা (Security):
- কিছু ফিল্ড যেমন পাসওয়ার্ড, ক্রেডেনশিয়াল বা সিক্রেট ডেটা কখনোই JSON-এ শেয়ার করা উচিত নয়। এই ফিল্ডগুলিকে এক্সক্লুড করতে Exclusion Strategy ব্যবহার করা হয়।
- পারফরম্যান্স (Performance):
- যদি কোনো অবজেক্টে অনেক বড় বা অপ্রয়োজনীয় ফিল্ড থাকে এবং আপনি শুধুমাত্র নির্দিষ্ট ফিল্ডগুলো JSON-এ পাঠাতে চান, তাহলে Exclusion Strategy ব্যবহার করে সেই ফিল্ডগুলো বাদ দিতে পারেন, যাতে ডেটার আকার ছোট হয়।
- ডেটা কাস্টমাইজেশন (Data Customization):
- কখনো কখনো JSON ডেটা ফরম্যাটটি একটি নির্দিষ্ট কাঠামো অনুসরণ করতে হয়, যেমন API-এর মাধ্যমে ডেটা পাঠানোর সময়। Exclusion Strategy ব্যবহার করে আপনি কাঠামো অনুযায়ী কিছু ফিল্ড বাদ দিতে বা কাস্টমাইজড ডেটা তৈরি করতে পারেন।
- ডেটার বৈধতা (Data Integrity):
- কিছু ক্ষেত্রে আপনি নিশ্চিত করতে চান যে JSON ডেটা কেবল নির্দিষ্ট ফিল্ডগুলো ধারণ করবে, যেমন কোনো ফিল্ডের মান
nullহলে তা এক্সক্লুড করা উচিত। Exclusion Strategy এই ধরনের যাচাইকরণের জন্য ব্যবহৃত হতে পারে।
- কিছু ক্ষেত্রে আপনি নিশ্চিত করতে চান যে JSON ডেটা কেবল নির্দিষ্ট ফিল্ডগুলো ধারণ করবে, যেমন কোনো ফিল্ডের মান
সারাংশ:
- Exclusion Strategy হল Gson-এর একটি কাস্টম কৌশল যা নির্দিষ্ট ফিল্ড বা ক্লাসগুলোকে সিরিয়ালাইজ বা ডেসেরিয়ালাইজ করার সময় এক্সক্লুড করার জন্য ব্যবহার করা হয়।
- এটি
ExclusionStrategyইন্টারফেস এবং@Exposeঅ্যানোটেশন দ্বারা অর্জিত হয়। - এটি নিরাপত্তা, পারফরম্যান্স এবং ডেটা কাস্টমাইজেশন বৃদ্ধি করার জন্য কার্যকরী।
Gson লাইব্রেরিতে @Expose এবং @SerializedName দুটি গুরুত্বপূর্ণ অ্যানোটেশন রয়েছে, যা JSON পার্সিং এবং সিরিয়ালাইজেশনে সাহায্য করে। এগুলো দিয়ে আপনি কীভাবে একটি Java অবজেক্টের নির্দিষ্ট ফিল্ডগুলিকে কাস্টমাইজ করতে পারেন তা বুঝতে সহায়তা করবে।
@Expose:
@Expose অ্যানোটেশনটি ব্যবহার করা হয় যাতে আপনি নির্দিষ্ট Java অবজেক্টের ফিল্ডগুলোকে সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করতে চান কিনা সেটি কাস্টমাইজ করতে পারেন।
ব্যবহার:
@Expose: যখন আপনি একটি ফিল্ডের জন্য@Exposeঅ্যানোটেশন ব্যবহার করেন, তখন সেই ফিল্ডটি Gson দিয়ে সিরিয়ালাইজ বা ডেসিরিয়ালাইজ হবে।@Expose(serialize = false, deserialize = false): আপনি যদি চান যে একটি ফিল্ড সিরিয়ালাইজ বা ডেসিরিয়ালাইজ না হোক, তাহলে আপনি এই অপশন ব্যবহার করতে পারেন।
উদাহরণ:
import com.google.gson.annotations.Expose;
public class Person {
@Expose
String name;
@Expose(serialize = false)
int age;
// কন্সট্রাকটর
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Gson সেটআপে @Expose ব্যবহার:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person("John Doe", 30);
// GsonBuilder ব্যবহার করে @Expose যুক্ত ফিল্ড সিরিয়ালাইজ করুন
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // শুধুমাত্র @Expose দিয়ে চিহ্নিত ফিল্ড সিরিয়ালাইজ করবে
.create();
String json = gson.toJson(person);
System.out.println(json);
}
}
আউটপুট:
{"name":"John Doe"}
এখানে age ফিল্ডটি @Expose(serialize = false) অ্যানোটেশনের কারণে JSON-এ সিরিয়ালাইজ হয়নি।
@SerializedName:
@SerializedName অ্যানোটেশনটি ব্যবহার করা হয় যখন আপনি Java অবজেক্টের ফিল্ডের নাম এবং JSON এর ফিল্ডের নাম আলাদা রাখতে চান। এটি JSON ফিল্ডের নামকে Java ফিল্ড নামের সাথে মেলানোর জন্য ব্যবহৃত হয়।
ব্যবহার:
@SerializedName: JSON এর ফিল্ড নাম এবং Java ফিল্ড নাম ভিন্ন হলে এটি ব্যবহৃত হয়। যেমন, JSON এ"first_name"এবং Java এ"firstName"ব্যবহার করা হলে@SerializedNameঅ্যানোটেশন দিয়ে এই দুইটি সম্পর্কিত করা যায়।
উদাহরণ:
import com.google.gson.annotations.SerializedName;
public class Person {
@SerializedName("first_name")
String firstName;
@SerializedName("last_name")
String lastName;
// কন্সট্রাকটর
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
JSON এর সাথে সামঞ্জস্য:
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
String json = "{\"first_name\":\"John\", \"last_name\":\"Doe\"}";
// Gson অবজেক্ট তৈরি করুন
Gson gson = new Gson();
// JSON স্ট্রিং থেকে Person অবজেক্টে রূপান্তর করুন
Person person = gson.fromJson(json, Person.class);
System.out.println("First Name: " + person.firstName);
System.out.println("Last Name: " + person.lastName);
}
}
আউটপুট:
First Name: John
Last Name: Doe
এখানে, JSON এর "first_name" এবং "last_name" এর মান Person ক্লাসের firstName এবং lastName ফিল্ডে ডেসিরিয়ালাইজ হয়েছে।
@Expose এবং @SerializedName একসাথে ব্যবহার:
@Expose এবং @SerializedName একসাথে ব্যবহার করে আপনি কাস্টম নাম ও সিরিয়ালাইজেশন কন্ট্রোল করতে পারেন।
উদাহরণ:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Person {
@SerializedName("first_name")
@Expose
String firstName;
@SerializedName("last_name")
@Expose(serialize = false)
String lastName;
// কন্সট্রাকটর
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
এখন, firstName সিরিয়ালাইজ হবে এবং JSON-এ "first_name" নামে প্রদর্শিত হবে, কিন্তু lastName সিরিয়ালাইজ হবে না কারণ @Expose(serialize = false) ব্যবহার করা হয়েছে।
Gson সেটআপ:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", "Doe");
// GsonBuilder ব্যবহার করে @Expose যুক্ত ফিল্ড সিরিয়ালাইজ করুন
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // শুধুমাত্র @Expose দিয়ে চিহ্নিত ফিল্ড সিরিয়ালাইজ করবে
.create();
String json = gson.toJson(person);
System.out.println(json);
}
}
আউটপুট:
{"first_name":"John"}
এখানে firstName ফিল্ড JSON-এ "first_name" হিসেবে সিরিয়ালাইজ হয়েছে এবং lastName সিরিয়ালাইজ হয়নি।
সারসংক্ষেপ:
@Expose:- সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করতে চান এমন ফিল্ডগুলোতে
@Exposeঅ্যানোটেশন ব্যবহার করুন। @Expose(serialize = false, deserialize = false)ব্যবহার করে কোনো ফিল্ড সিরিয়ালাইজ বা ডেসিরিয়ালাইজ না করতে পারেন।
- সিরিয়ালাইজ বা ডেসিরিয়ালাইজ করতে চান এমন ফিল্ডগুলোতে
@SerializedName:- JSON-এর ফিল্ড নাম এবং Java অবজেক্টের ফিল্ড নাম ভিন্ন হলে
@SerializedNameব্যবহার করুন। - এটি JSON এবং Java অবজেক্টের নামের মধ্যে ম্যাপিং তৈরি করতে সাহায্য করে।
- JSON-এর ফিল্ড নাম এবং Java অবজেক্টের ফিল্ড নাম ভিন্ন হলে
এই দুটি অ্যানোটেশনকে একসাথে ব্যবহার করে JSON পার্সিং এবং সিরিয়ালাইজেশন প্রক্রিয়া অনেক বেশি কাস্টমাইজযোগ্য হয়।
Gson-এ Field Level Customization দ্বারা আপনি নির্দিষ্ট একটি ফিল্ডের জন্য কাস্টম সেরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন পরিচালনা করতে পারেন। এটি করার জন্য @SerializedName, @Expose, এবং @JsonAdapter এর মতো অ্যানোটেশন ব্যবহার করা যেতে পারে।
নিচে কিছু সাধারণ টেকনিক্স ব্যাখ্যা করা হয়েছে যা আপনি Gson এর ফিল্ড লেভেল কাস্টমাইজেশনের জন্য ব্যবহার করতে পারেন।
1. @SerializedName ব্যবহার করা
@SerializedName অ্যানোটেশনটি মূলত ফিল্ডের নাম পরিবর্তন করতে ব্যবহৃত হয় যখন JSON-এর ফিল্ডের নাম Java ক্লাসের ফিল্ড নামের সাথে মেলে না। এর মাধ্যমে আপনি JSON এবং Java কোডের মধ্যে নামের অমিল মেটাতে পারেন।
উদাহরণ:
import com.google.gson.annotations.SerializedName;
class Person {
@SerializedName("full_name")
private String name;
@SerializedName("age_in_years")
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
// Gson তৈরি করা
Gson gson = new Gson();
// Java Object তৈরি করা
Person person = new Person("John Doe", 30);
// Java Object কে JSON এ কনভার্ট করা
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// JSON থেকে Java Object এ কনভার্ট করা
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + personFromJson.getName() + ", Age: " + personFromJson.getAge());
}
}
আউটপুট:
Serialized JSON: {"full_name":"John Doe","age_in_years":30}
Deserialized Person: John Doe, Age: 30
এখানে, @SerializedName("full_name") এবং @SerializedName("age_in_years") অ্যানোটেশন ব্যবহার করে JSON ফিল্ড নামের সাথে Java ফিল্ড নামের অমিল মেটানো হয়েছে।
2. @Expose ব্যবহার করা
@Expose অ্যানোটেশনটি আপনাকে নির্দিষ্ট ফিল্ডগুলিকে JSON সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার জন্য এক্সপোজ বা এক্সক্লুড করার সুযোগ দেয়। যদি আপনি একটি ফিল্ডকে JSON পার্সিং প্রক্রিয়া থেকে বাদ দিতে চান, তাহলে @Expose ব্যবহার করতে পারেন।
উদাহরণ:
import com.google.gson.annotations.Expose;
class Person {
@Expose
private String name;
@Expose(serialize = false, deserialize = false)
private int age; // এই ফিল্ডটি সিরিয়ালাইজ বা ডেসিরিয়ালাইজ হবে না
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
// Gson তৈরি করা
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); // Expose ব্যবহার
// Java Object তৈরি করা
Person person = new Person("John Doe", 30);
// Java Object কে JSON এ কনভার্ট করা
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// JSON থেকে Java Object এ কনভার্ট করা
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + personFromJson.getName());
}
}
আউটপুট:
Serialized JSON: {"name":"John Doe"}
Deserialized Person: John Doe
এখানে, age ফিল্ডটি @Expose(serialize = false, deserialize = false) দ্বারা বাদ দেওয়া হয়েছে, তাই এটি JSON এ সেরিয়ালাইজ এবং ডেসিরিয়ালাইজ হয়নি।
3. @JsonAdapter ব্যবহার করা
যদি আপনি নির্দিষ্ট ফিল্ডের জন্য কাস্টম সেরিয়ালাইজার বা ডেসিরিয়ালাইজার ব্যবহার করতে চান, তবে আপনি @JsonAdapter অ্যানোটেশনটি ব্যবহার করতে পারেন। এটি কাস্টম TypeAdapter ব্যবহার করতে সাহায্য করে।
উদাহরণ:
import com.google.gson.*;
import com.google.gson.annotations.JsonAdapter;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
// কাস্টম সেরিয়ালাইজার এবং ডেসিরিয়ালাইজার
class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
private static final String DATE_FORMAT = "yyyy-MM-dd";
@Override
public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return new JsonPrimitive(sdf.format(date));
}
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
try {
return sdf.parse(json.getAsString());
} catch (Exception e) {
throw new JsonParseException("Invalid date format", e);
}
}
}
class Person {
private String name;
@JsonAdapter(DateAdapter.class) // কাস্টম অ্যাডাপ্টার ব্যবহার
private Date birthDate;
public Person(String name, Date birthDate) {
this.name = name;
this.birthDate = birthDate;
}
public String getName() {
return name;
}
public Date getBirthDate() {
return birthDate;
}
}
public class Main {
public static void main(String[] args) {
// Gson তৈরি করা
Gson gson = new Gson();
// Java Object তৈরি করা
Person person = new Person("John Doe", new Date());
// Java Object কে JSON এ কনভার্ট করা
String json = gson.toJson(person);
System.out.println("Serialized JSON: " + json);
// JSON থেকে Java Object এ কনভার্ট করা
Person personFromJson = gson.fromJson(json, Person.class);
System.out.println("Deserialized Person: " + personFromJson.getName() + ", Birth Date: " + personFromJson.getBirthDate());
}
}
আউটপুট:
Serialized JSON: {"name":"John Doe","birthDate":"2024-12-19"}
Deserialized Person: John Doe, Birth Date: Thu Dec 19 14:56:34 UTC 2024
এখানে, @JsonAdapter(DateAdapter.class) ব্যবহার করা হয়েছে, যা birthDate ফিল্ডের জন্য কাস্টম DateAdapter অ্যাডাপ্টার নির্ধারণ করে।
Gson-এ Field Level Customization আপনাকে JSON পার্সিং এবং সিরিয়ালাইজেশনে আরো নমনীয়তা দেয়। @SerializedName, @Expose, এবং @JsonAdapter অ্যানোটেশন ব্যবহার করে আপনি নির্দিষ্ট ফিল্ডগুলির জন্য কাস্টমাইজেশন পরিচালনা করতে পারেন।
Gson ব্যবহার করে Sensitive Data Exclusion করতে হলে, আপনি সাধারণত কিছু কৌশল ব্যবহার করেন যাতে গোপন বা সংবেদনশীল তথ্য (যেমন পাসওয়ার্ড, ক্রেডেনশিয়ালস ইত্যাদি) JSON রেসপন্সে প্রকাশ না পায়। Gson কিছু কাস্টমাইজেশন পদ্ধতি সরবরাহ করে যা আপনাকে এই ধরনের তথ্য ফিল্টার করতে সাহায্য করতে পারে।
এখানে কয়েকটি পদ্ধতি দেওয়া হল যেগুলোর মাধ্যমে আপনি Sensitive Data Exclusion করতে পারেন:
1. @Expose অ্যানোটেশন এবং GsonBuilder এর মাধ্যমে Sensitive Data Exclusion
Gson এ @Expose অ্যানোটেশন ব্যবহার করে আপনি স্পেসিফিক ফিল্ডগুলোকে JSON এ এক্সপোজ (প্রকাশ) করতে পারেন, এবং অন্যগুলোকে exclude (অবহেলা) করতে পারেন। এটা বিশেষ করে তখন কাজে আসে যখন আপনি কিছু ফিল্ড বা প্রপার্টি JSON আউটপুটে অন্তর্ভুক্ত করতে চান না।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
class User {
@Expose
String username;
@Expose(serialize = false) // Sensitive data (password) will not be included in the JSON output
String password;
@Expose
String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
}
public class GsonSensitiveDataExample {
public static void main(String[] args) {
// Create a User object
User user = new User("john_doe", "secret_password", "john.doe@example.com");
// GsonBuilder to include only fields with @Expose annotation
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
// Convert User object to JSON
String json = gson.toJson(user);
System.out.println(json);
}
}
আউটপুট:
{"username":"john_doe","email":"john.doe@example.com"}
ব্যাখ্যা:
@Exposeঅ্যানোটেশন ব্যবহার করা হয়েছেusernameএবংemailফিল্ডে, কিন্তুpasswordফিল্ডে@Expose(serialize = false)ব্যবহার করা হয়েছে, যার মানে হল যে এই ফিল্ডটি JSON আউটপুটে অন্তর্ভুক্ত হবে না।GsonBuilder().excludeFieldsWithoutExposeAnnotation()এর মাধ্যমে আমরা কেবলমাত্র সেই ফিল্ডগুলো JSON এ অন্তর্ভুক্ত করেছি যেগুলোর উপর@Exposeঅ্যানোটেশন ব্যবহার করা হয়েছে।
2. কাস্টম JsonSerializer দিয়ে Sensitive Data Exclusion
আপনি JsonSerializer ইন্টারফেস ব্যবহার করে আরও কাস্টমাইজড ভাবে Sensitive Data ফিল্টার করতে পারেন। এই ক্ষেত্রে, আপনি JSON এর প্রক্রিয়াকরণে কাস্টম লজিক প্রয়োগ করে কিছু ফিল্ড বাদ দিতে পারেন।
উদাহরণ:
import com.google.gson.*;
import java.lang.reflect.Type;
class User {
String username;
String password;
String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
}
class UserSerializer implements JsonSerializer<User> {
@Override
public JsonElement serialize(User user, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("username", user.username);
jsonObject.addProperty("email", user.email); // Exclude password
return jsonObject;
}
}
public class GsonCustomSensitiveDataExample {
public static void main(String[] args) {
// Create User object
User user = new User("john_doe", "secret_password", "john.doe@example.com");
// Use GsonBuilder with custom serializer
Gson gson = new GsonBuilder().registerTypeAdapter(User.class, new UserSerializer()).create();
// Convert User object to JSON
String json = gson.toJson(user);
System.out.println(json);
}
}
আউটপুট:
{"username":"john_doe","email":"john.doe@example.com"}
ব্যাখ্যা:
- এই উদাহরণে,
UserSerializerকাস্টমJsonSerializerতৈরি করা হয়েছে যাতেpasswordফিল্ডটি JSON আউটপুট থেকে বাদ পড়ে এবং শুধুমাত্রusernameওemailJSON এ অন্তর্ভুক্ত হয়। GsonBuilderদিয়ে কাস্টমUserSerializerব্যবহার করা হয়েছে JSON রূপান্তরের সময় sensitive data (যেমনpassword) বাদ দেওয়ার জন্য।
3. transient ফিল্ড ব্যবহার করে Sensitive Data Exclusion
Java এর transient কীওয়ার্ড ব্যবহার করে আপনি কিছু ফিল্ডকে Serialization থেকে বাদ দিতে পারেন। Gson এই transient ফিল্ডগুলোকে JSON আউটপুটে অন্তর্ভুক্ত করবে না।
উদাহরণ:
import com.google.gson.Gson;
class User {
String username;
transient String password; // 'password' field will be excluded from JSON serialization
String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
}
public class GsonTransientSensitiveDataExample {
public static void main(String[] args) {
// Create a User object
User user = new User("john_doe", "secret_password", "john.doe@example.com");
// Create a Gson object
Gson gson = new Gson();
// Convert User object to JSON
String json = gson.toJson(user);
System.out.println(json);
}
}
আউটপুট:
{"username":"john_doe","email":"john.doe@example.com"}
ব্যাখ্যা:
transientকীওয়ার্ড ব্যবহার করা হয়েছেpasswordফিল্ডের সাথে, তাই Gson এই ফিল্ডটি JSON আউটপুটে অন্তর্ভুক্ত করবে না।@Exposeঅ্যানোটেশন এবংGsonBuilderব্যবহার করে আপনি সহজেই sensitive data ফিল্টার করতে পারেন।JsonSerializerদিয়ে কাস্টম লজিক প্রয়োগ করে আরও উন্নত কাস্টমাইজেশন করা যায়।transientকীওয়ার্ড ব্যবহার করে কিছু ফিল্ডকে JSON থেকে বাদ দেওয়া যায়।
এই পদ্ধতিগুলি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে sensitive data নিরাপদ রাখতে পারেন এবং JSON এ শুধুমাত্র প্রয়োজনীয় তথ্য প্রকাশ করতে পারেন।
Read more