Gson-এ null values এবং default values এর ব্যবস্থাপনা কাস্টমাইজ করা যায়। আপনি চাইলে null values বা default values JSON-এ অন্তর্ভুক্ত না করতেও পারেন, অথবা আপনি তাদের জন্য কাস্টম মান ব্যবহার করতে পারেন।
1. Null Values এর ব্যবস্থাপনা
Gson ডিফল্টভাবে null values JSON এ অন্তর্ভুক্ত করে, তবে আপনি চাইলে null ফিল্ডগুলো JSON থেকে বাদ দিতে বা কাস্টম আচরণ করতে পারেন।
1.1 Null Values বাদ দেয়া
Gson-এ null values বাদ দিতে GsonBuilder ব্যবহার করে serializeNulls() মেথড ব্যবহার করতে হয়। যদি আপনি null values JSON এ অন্তর্ভুক্ত না করতে চান, তাহলে এটি ব্যবহার করবেন না।
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(null, null);
// null values বাদ দেওয়ার জন্য serializeNulls() ব্যবহার না করা
Gson gsonWithoutNulls = new GsonBuilder().create();
String jsonWithoutNulls = gsonWithoutNulls.toJson(person);
System.out.println("Without nulls: " + jsonWithoutNulls);
// null values সহ JSON তৈরি করার জন্য serializeNulls() ব্যবহার করা
Gson gsonWithNulls = new GsonBuilder().serializeNulls().create();
String jsonWithNulls = gsonWithNulls.toJson(person);
System.out.println("With nulls: " + jsonWithNulls);
}
}
আউটপুট:
Without nulls: {"name":"John","age":25}
With nulls: {"name":null,"age":null}
2. Default Values এর ব্যবস্থাপনা
যখন একটি null মান থাকে, আপনি একটি default value সেট করতে চান, তাহলে সেটি @SerializedName বা কাস্টম Deserializer/ Serializer ব্যবহার করে করতে পারেন।
2.1 Default Value Set করা
Gson-এ একটি প্রোপার্টির জন্য default value সেট করতে হলে আপনি @Expose বা @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন, তবে আপনি কাস্টম ডিফল্ট ভ্যালু দিয়ে Serializer তৈরি করে সেটি কাস্টমাইজও করতে পারবেন।
3. Custom Default Value via Custom Serializer
আপনি যদি চান যে কোনো ফিল্ডের জন্য ডিফল্ট মান ব্যবহার করা হোক (যেমন null মানের পরিবর্তে), তাহলে JsonSerializer ব্যবহার করে কাস্টম ডিফল্ট মান দেয়া যেতে পারে।
import com.google.gson.*;
import java.lang.reflect.Type;
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(null, null);
// Gson Builder ব্যবহার করে কাস্টম Serializer যুক্ত করা
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonSerializer())
.create();
String json = gson.toJson(person);
System.out.println("JSON with default values: " + json);
}
}
class PersonSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
// যদি নাম null হয়, তবে default value হিসেবে "Unknown" সেট করা
jsonObject.addProperty("name", (person.getName() == null) ? "Unknown" : person.getName());
// যদি বয়স null হয়, তবে default value হিসেবে 18 সেট করা
jsonObject.addProperty("age", (person.getAge() == null) ? 18 : person.getAge());
return jsonObject;
}
}
আউটপুট:
{
"name": "Unknown",
"age": 18
}
4. Default Values via Annotations
Gson এ @SerializedName অ্যানোটেশন ব্যবহার করে আপনি কাস্টম নাম এবং ডিফল্ট মান সেট করতে পারেন। কিন্তু যদি JSON ফিল্ড না থাকে, তখন ডিফল্ট মান কী হবে, তা কাস্টম Serialization বা Deserialization-এর মাধ্যমে সামলাতে হয়।
5. Gson Null Value and Default Value Use Cases:
- Null Values বাদ দেয়া: যদি আপনি চান যে JSON এ
nullমানের ফিল্ড না আসে, তবেserializeNulls()ব্যবহার করবেন না। - Default Value Set করা: যদি JSON অবজেক্টের কোনো ফিল্ড
nullথাকে এবং আপনি সেটির জন্য একটি ডিফল্ট মান দিতে চান, তবে Custom Serializer ব্যবহার করে সেটি করতে পারেন।
সারাংশ
- Null Values:
serializeNulls()এর মাধ্যমে আপনি Gson এর আচরণ কাস্টমাইজ করতে পারেন। - Default Values: কাস্টম Serializer তৈরি করে আপনি
nullমানের পরিবর্তে ডিফল্ট মান সেট করতে পারেন, অথবা আপনি একটি@SerializedNameঅ্যানোটেশন ব্যবহার করে ফিল্ডের নাম কাস্টমাইজ করতে পারেন।
এভাবে আপনি Gson-এ null values এবং default values কাস্টমাইজ করতে পারবেন।
Gson লাইব্রেরি JSON ডেটার সাথে কাজ করার সময় null values হ্যান্ডল করার জন্য বেশ কিছু উপায় প্রদান করে। Gson দ্বারা null values ডিফল্টভাবে JSON ডেটাতে null হিসেবে সিরিয়ালাইজ করা হয়, এবং যখন JSON থেকে Java Object-এ ডিসেরিয়ালাইজ করা হয়, তখন null মানগুলি সঠিকভাবে সেট করা হয়। তবে, কিছু সময়ে আপনি যদি null values হ্যান্ডল করার সময় কাস্টমাইজেশন করতে চান (যেমন, null মানগুলিকে বাদ দেওয়া বা আলাদাভাবে হ্যান্ডেল করা), তাহলে Gson কিছু কনফিগারেশন অপশনও প্রদান করে।
এখানে JSON এ null values হ্যান্ডল করার বিভিন্ন পদ্ধতি আলোচনা করা হলো।
১. ডিফল্টভাবে Null Value সিরিয়ালাইজেশন
Gson ডিফল্টভাবে যেকোনো null মানকে JSON এ null হিসেবে সিরিয়ালাইজ করে। যেমন:
উদাহরণ ১: JSON এ null value সিরিয়ালাইজ করা
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", null); // "address" is null
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json); // Output: {"name":"John","address":null}
}
}
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
এখানে, address ফিল্ডটির মান null হওয়ার কারণে JSON ডেটাতে address: null হিসেবে দেখা যাবে।
২. Null Values বাদ দেয়া (Exclude Null Fields)
Gson ব্যবহার করে আপনি null values বাদ দেয়ার জন্য কাস্টম সেটিংস করতে পারেন, যাতে null fields JSON-এ সিরিয়ালাইজ না হয়। এটি GsonBuilder এর excludeFieldsWithoutExposeAnnotation() অথবা serializeNulls() অপশন ব্যবহার করে করা যেতে পারে।
উদাহরণ ২: Null Values বাদ দেয়া (exclude null fields)
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", null); // "address" is null
Gson gson = new GsonBuilder()
.serializeNulls() // Null values will be included
.create();
String json = gson.toJson(person);
System.out.println(json); // Output: {"name":"John","address":null}
Gson gsonWithoutNulls = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // Exclude null fields
.create();
String jsonWithoutNulls = gsonWithoutNulls.toJson(person);
System.out.println(jsonWithoutNulls); // Output: {"name":"John"}
}
}
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
৩. Null Values হ্যান্ডলিং এর জন্য কাস্টম Serializer এবং Deserializer তৈরি করা
কখনো কখনো আপনি null values কে বিশেষভাবে হ্যান্ডল করতে চান, যেমন একটি ফিল্ডে null আসলে একটি ডিফল্ট মান দিতে চান। এমন ক্ষেত্রে আপনি কাস্টম Serializer এবং Deserializer ব্যবহার করতে পারেন।
উদাহরণ ৩: Custom Serializer ব্যবহার করে Null Values হ্যান্ডল করা
import com.google.gson.*;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", null); // "address" is null
Gson gson = new GsonBuilder()
.registerTypeAdapter(String.class, new NullStringAdapter()) // Register custom adapter
.create();
String json = gson.toJson(person);
System.out.println(json); // Output: {"name":"John","address":"N/A"}
}
}
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
// Custom Serializer for handling null String values
class NullStringAdapter implements JsonSerializer<String> {
@Override
public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
if (src == null) {
return new JsonPrimitive("N/A"); // Return a default value for null
}
return new JsonPrimitive(src);
}
}
এখানে NullStringAdapter কাস্টম সিরিয়ালাইজার ব্যবহার করা হয়েছে যা null মানগুলিকে "N/A" তে রূপান্তরিত করে।
উদাহরণ ৪: Custom Deserializer ব্যবহার করে Null Values হ্যান্ডল করা
import com.google.gson.*;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"address\":null}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new NullAddressDeserializer()) // Register custom deserializer
.create();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.address); // Output: "Unknown Address"
}
}
class Person {
String name;
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
// Custom Deserializer for handling null address values
class NullAddressDeserializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
String address = jsonObject.has("address") && !jsonObject.get("address").isJsonNull()
? jsonObject.get("address").getAsString()
: "Unknown Address"; // Provide default value for null address
return new Person(name, address);
}
}
এখানে NullAddressDeserializer কাস্টম ডেসেরিয়ালাইজার ব্যবহার করা হয়েছে যা null মানের ক্ষেত্রে একটি ডিফল্ট মান "Unknown Address" প্রদান করে।
৪. Null Values সিরিয়ালাইজ না করার জন্য excludeFieldsWithoutExposeAnnotation() ব্যবহার
আপনি যদি কোনো ফিল্ডকে null value থাকলে সিরিয়ালাইজ করতে না চান, তবে @Expose এনোটেশন ব্যবহার করতে পারেন।
উদাহরণ ৫: @Expose এনোটেশন ব্যবহার করে Null Values হ্যান্ডল করা
import com.google.gson.Gson;
import com.google.gson.annotations.Expose;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", null); // "address" is null
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // Exclude fields without @Expose annotation
.create();
String json = gson.toJson(person);
System.out.println(json); // Output: {"name":"John"}
}
}
class Person {
@Expose
String name;
@Expose(serialize = false) // Prevent serialization of "address" field
String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
এখানে, address ফিল্ডটি serialize = false দিয়ে এক্সক্লুড করা হয়েছে, ফলে তা JSON-এ সিরিয়ালাইজ হবে না।
Gson লাইব্রেরি null values হ্যান্ডল করার জন্য বেশ কিছু সুবিধা প্রদান করে, যেমন:
- ডিফল্টভাবে null মান JSON এ সিরিয়ালাইজ হয়।
- আপনি null values বাদ দিতে পারেন বা কাস্টম সিরিয়ালাইজার এবং ডেসেরিয়ালাইজার ব্যবহার করতে পারেন।
@Exposeএবং TypeToken এর সাহায্যে null মানগুলোকে আরও নিয়ন্ত্রণ করতে পারেন।
এটি JSON ডেটার সাথে কাজ করার সময় আরো নমনীয়তা এবং কাস্টমাইজেশনের সুযোগ প্রদান করে।
Gson লাইব্রেরি দিয়ে null এবং empty fields (ফাঁকা ফিল্ড) সংক্রান্ত কনফিগারেশন করা যায়। আপনি চাইলে null মান এবং empty ফিল্ডগুলোকে JSON ডেটা থেকে বাদ দিতে বা অন্তর্ভুক্ত করতে পারেন। Gson এ এই ধরনের কনফিগারেশন করতে GsonBuilder ব্যবহার করা হয়।
1. Null মানকে JSON থেকে বাদ দেওয়া:
Gson এর মাধ্যমে null মানকে JSON থেকে বাদ দিতে হলে, GsonBuilder এ serializeNulls() মেথডের পরিবর্তে excludeFieldsWithoutExposeAnnotation() বা null ফিল্ডের জন্য কনফিগারেশন করতে হয়।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Person {
String name;
Integer age;
String address;
// Constructor
public Person(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
// GsonBuilder দিয়ে Gson তৈরি করা
Gson gson = new GsonBuilder()
.serializeNulls() // null মানও JSON-এ অন্তর্ভুক্ত হবে
.create();
// Person অবজেক্ট তৈরি
Person person = new Person("John", null, "New York");
// Gson এর মাধ্যমে Person অবজেক্টকে JSON-এ রূপান্তর করা
String json = gson.toJson(person);
// JSON প্রিন্ট করা
System.out.println(json);
}
}
আউটপুট:
{"name":"John","age":null,"address":"New York"}
এখানে serializeNulls() মেথড ব্যবহার করে null ফিল্ডগুলোও JSON এ অন্তর্ভুক্ত করা হয়েছে। তবে, যদি null ফিল্ড বাদ দিতে চান, তাহলে serializeNulls() মেথড ব্যবহার করবেন না।
2. Empty Fields (ফাঁকা ফিল্ড) বাদ দেওয়া:
কখনও কখনও আপনি চাইতে পারেন যে যদি কোনো ফিল্ডের মান empty (খালি স্ট্রিং বা কোনো ভ্যালু না থাকে) থাকে, তাহলে তা JSON ডেটায় অন্তর্ভুক্ত না করা হোক। Gson এর মাধ্যমে এই কনফিগারেশনও করা সম্ভব।
এখানে GsonBuilder এর excludeFieldsWithoutExposeAnnotation() ব্যবহার করা হয় অথবা Gson এর setLenient() ফিচার ব্যবহার করতে পারেন, কিন্তু সাধারণভাবে ফাঁকা মানের ক্ষেত্রে null চেক করা হয় এবং @Expose অ্যানোটেশন ব্যবহার করে ফিল্ডগুলো নির্বাচন করা যায়।
উদাহরণ: Empty Fields বাদ দেওয়া:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Person {
String name;
String address;
// Constructor
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
// GsonBuilder দিয়ে Gson তৈরি করা
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() // Expose অ্যানোটেশন ছাড়া ফিল্ডগুলো বাদ দেবে
.create();
// Person অবজেক্ট তৈরি
Person person = new Person("John", "");
// Gson এর মাধ্যমে Person অবজেক্টকে JSON-এ রূপান্তর করা
String json = gson.toJson(person);
// JSON প্রিন্ট করা
System.out.println(json);
}
}
আউটপুট:
{"name":"John"}
এখানে address ফিল্ডে ফাঁকা মান (empty) থাকায় তা JSON-এ অন্তর্ভুক্ত হয়নি।
3. Null এবং Empty Fields বাদ দেওয়া - কোড উদাহরণ:
এখন যদি আপনি চান যে null এবং empty ফিল্ডগুলো JSON থেকে বাদ দেওয়া হোক, তবে আপনি GsonBuilder ব্যবহার করতে পারেন।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Person {
String name;
String address;
// Constructor
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
// GsonBuilder দিয়ে Gson তৈরি করা
Gson gson = new GsonBuilder()
.serializeNulls() // null মানগুলোকে JSON-এ অন্তর্ভুক্ত করবে
.create();
// Person অবজেক্ট তৈরি
Person person = new Person("John", "");
// Gson এর মাধ্যমে Person অবজেক্টকে JSON-এ রূপান্তর করা
String json = gson.toJson(person);
// JSON প্রিন্ট করা
System.out.println(json);
}
}
আউটপুট:
{
"name": "John",
"address": ""
}
এখানে address ফিল্ডটি ফাঁকা থাকায়, তা JSON ডেটায় অন্তর্ভুক্ত হয়েছে, কিন্তু আপনি চাইলে এটা বাদ দেওয়ার জন্য কাস্টম কনভার্টার বা অ্যাপ্লিকেশন লজিক প্রয়োগ করতে পারেন।
4. Gson এর সাথে কাস্টম Serializer ব্যবহার করা:
আপনি কাস্টম Serializer ব্যবহার করে null এবং empty ফিল্ডগুলো অটো বাদ দিতে পারেন।
উদাহরণ:
import com.google.gson.*;
import java.lang.reflect.Type;
class Person {
String name;
String address;
// Constructor
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
public class Main {
public static void main(String[] args) {
// GsonBuilder দিয়ে Gson তৈরি করা
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new JsonSerializer<Person>() {
@Override
public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
if (person.name != null) {
jsonObject.addProperty("name", person.name);
}
if (person.address != null && !person.address.isEmpty()) {
jsonObject.addProperty("address", person.address);
}
return jsonObject;
}
})
.create();
// Person অবজেক্ট তৈরি
Person person = new Person("John", "");
// Gson এর মাধ্যমে Person অবজেক্টকে JSON-এ রূপান্তর করা
String json = gson.toJson(person);
// JSON প্রিন্ট করা
System.out.println(json);
}
}
আউটপুট:
{"name":"John"}
এখানে, কাস্টম JsonSerializer ব্যবহার করে ফাঁকা (empty) এবং null ফিল্ডগুলো বাদ দেওয়া হয়েছে।
সংক্ষেপে:
serializeNulls(): null ফিল্ডগুলো JSON-এ অন্তর্ভুক্ত করবে।excludeFieldsWithoutExposeAnnotation():@Exposeঅ্যানোটেশন ছাড়া ফিল্ডগুলো বাদ দেবে।- কাস্টম Serializer: কাস্টম লজিক প্রয়োগ করে null বা empty ফিল্ড বাদ দেওয়া যেতে পারে।
এভাবে, Gson-এর মাধ্যমে আপনি null এবং empty ফিল্ডের কনফিগারেশন সহজে নিয়ন্ত্রণ করতে পারেন।
Gson ব্যবহার করে JSON ডেটা ডেসিরিয়ালাইজ করার সময়, যদি কোন ফিল্ড JSON ডেটাতে না থাকে, তাহলে সাধারণভাবে সে ফিল্ডটির ডিফল্ট মান (default value) সেট করা হয়। তবে, আপনি চাইলে কাস্টম ডিফল্ট মানও সেট করতে পারেন, যাতে আপনি যখন JSON ডেটাতে কোন ফিল্ডের মান না পান, তখন সেই কাস্টম মান ব্যবহার করা হয়।
Default Value Handling in Gson
Gson ব্যবহার করে ডিফল্ট মান সেট করতে গেলে সাধারণভাবে আপনি @SerializedName অ্যানোটেশন বা কাস্টম ডেসিরিয়ালাইজার ব্যবহার করতে পারেন। নিচে দুটো উদাহরণ দেওয়া হয়েছে:
1. ডিফল্ট মানের জন্য সাধারণ পদ্ধতি:
যদি JSON ডেটাতে কোন ফিল্ডের মান না থাকে, তবে Java ক্লাসে ঐ ফিল্ডের ডিফল্ট মান ব্যবহৃত হবে।
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter and Setter methods
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;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\"}"; // age ফিল্ডটি JSON তে নেই
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person); // Output: Person{name='John', age=0}
}
}
এখানে age ফিল্ডটির জন্য ডিফল্ট মান 0 হবে, কারণ এটি int টাইপ এবং int এর ডিফল্ট মান হল 0।
2. কাস্টম ডিফল্ট মান সেট করা (Custom Default Value):
যদি আপনি চাইলে কোন ফিল্ডে কাস্টম ডিফল্ট মান সেট করতে, তাহলে আপনি @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন বা কাস্টম ডেসিরিয়ালাইজার তৈরি করতে পারেন।
উদাহরণ: কাস্টম ডিফল্ট মান
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
class Person {
private String name;
@SerializedName("age")
private Integer age = 30; // Default value 30 if not found in JSON
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\"}"; // age ফিল্ডটি JSON তে নেই
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person); // Output: Person{name='John', age=30}
}
}
এখানে, যদি JSON ডেটাতে age ফিল্ডের মান না থাকে, তবে age ফিল্ডের ডিফল্ট মান হবে 30।
3. কাস্টম ডেসিরিয়ালাইজার ব্যবহার করা:
আপনি চাইলে কাস্টম ডেসিরিয়ালাইজার তৈরি করে JSON ডেটা ডেসিরিয়ালাইজ করার সময় ডিফল্ট মান সেট করতে পারেন। এটি আরও ফ্লেক্সিবিলিটি দেয় এবং আপনি আরো কাস্টম লজিক প্রয়োগ করতে পারেন।
import com.google.gson.*;
import java.lang.reflect.Type;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
class PersonDeserializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.has("name") ? jsonObject.get("name").getAsString() : "Unknown"; // Default to "Unknown"
int age = jsonObject.has("age") ? jsonObject.get("age").getAsInt() : 25; // Default to 25
return new Person(name, age);
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\"}"; // age ফিল্ডটি JSON তে নেই
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonDeserializer()) // Register custom deserializer
.create();
Person person = gson.fromJson(json, Person.class);
System.out.println(person); // Output: Person{name='John', age=25}
}
}
ব্যাখ্যা:
PersonDeserializer: এটি একটি কাস্টম ডেসিরিয়ালাইজার, যা JSON ডেটাতে ফিল্ডের উপস্থিতি চেক করে। যদি কোন ফিল্ড অনুপস্থিত থাকে, তাহলে সেটি একটি কাস্টম ডিফল্ট মান (যেমনageজন্য25এবংnameজন্যUnknown) সেট করে।GsonBuilder:registerTypeAdapterমেথড ব্যবহার করে কাস্টম ডেসিরিয়ালাইজারকেGsonএ নিবন্ধিত করা হয়েছে।
সারাংশ:
- Gson ডিফল্টভাবে JSON ডেটাতে কোনো ফিল্ড অনুপস্থিত থাকলে Java ক্লাসের ডিফল্ট মান ব্যবহার করে।
- আপনি কাস্টম ডিফল্ট মান সেট করতে পারেন Java ক্লাসে প্রপার্টির জন্য, অথবা কাস্টম ডেসিরিয়ালাইজার ব্যবহার করে JSON ডেটা ডেসিরিয়ালাইজ করার সময় বিশেষ মান প্রয়োগ করতে পারেন।
- এইভাবে আপনি আপনার প্রোজেক্টের জন্য আরো নিয়ন্ত্রণ রাখতে পারেন।
Gson লাইব্রেরি ডিফল্টভাবে null মানের ফিল্ডগুলোকে JSON ডেটাতে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় অন্তর্ভুক্ত করে। তবে, অনেক সময় আপনি চাইবেন যে null মানের ফিল্ডগুলোকে সিরিয়ালাইজেশনের সময় উপেক্ষা করা হোক, অর্থাৎ তারা JSON আউটপুটে না আসুক।
Null Ignoring করার জন্য Gson একটি কনফিগারেশন অপশন সরবরাহ করে।
Serialization এর সময় Null Ignoring
যখন আপনি JSON-এ একটি Java অবজেক্ট সিরিয়ালাইজ করেন, তখন আপনি চাইলে null মানের প্রপার্টি বা ফিল্ডগুলোকে উপেক্ষা করতে পারেন। এটি করার জন্য Gson-এর GsonBuilder এর serializeNulls() মেথডটি ব্যবহার করা হয়।
যদি serializeNulls() না ব্যবহার করা হয়, তাহলে Gson ডিফল্টভাবে null মানের প্রপার্টি গুলি JSON আউটপুটে অন্তর্ভুক্ত করবে।
উদাহরণ: Null Ignoring during Serialization
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Main {
public static void main(String[] args) {
Person person = new Person("John", null, 25);
// GsonBuilder দিয়ে Null গুলি উপেক্ষা করে JSON সিরিয়ালাইজ করা
Gson gson = new GsonBuilder()
.serializeNulls() // এই লাইনটি Null গুলি সিরিয়ালাইজ করবে
.create();
String jsonWithNulls = gson.toJson(person);
System.out.println("Serialized with Nulls: " + jsonWithNulls);
// GsonBuilder দিয়ে Null গুলি উপেক্ষা করে JSON সিরিয়ালাইজ করা
gson = new GsonBuilder()
.create(); // Null গুলি সিরিয়ালাইজ হবে না
String jsonWithoutNulls = gson.toJson(person);
System.out.println("Serialized without Nulls: " + jsonWithoutNulls);
}
}
class Person {
String name;
String address;
int age;
Person(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
}
আউটপুট:
Serialized with Nulls: {"name":"John","address":null,"age":25}
Serialized without Nulls: {"name":"John","age":25}
ব্যাখ্যা:
- প্রথম Gson অবজেক্টে
serializeNulls()ব্যবহার করা হয়েছে, যার ফলেaddressফিল্ডেরnullমান JSON আউটপুটে অন্তর্ভুক্ত হয়েছে। - দ্বিতীয় Gson অবজেক্টে
serializeNulls()ব্যবহার করা হয়নি, ফলেaddressফিল্ডটি আউটপুটে অন্তর্ভুক্ত হয়নি।
Deserialization এর সময় Null Ignoring
Deserialization এর সময়, যদি JSON ডেটাতে কিছু null মান থাকে, এবং আপনি যদি সেই ফিল্ডগুলোর জন্য ডিফল্ট মান দিতে চান, তাহলে Gson এই কাজটি করতে পারে। তবে null উপেক্ষা করার জন্য কোনও নির্দিষ্ট কনফিগারেশন প্রয়োজন নেই, কারণ Gson স্বয়ংক্রিয়ভাবে null ডেটা গ্রহণ করতে পারে এবং Java অবজেক্টের জন্য সেগুলি null হিসেবে রূপান্তর করে।
যদি আপনি null মানগুলোকে কিছু ডিফল্ট মানে পরিবর্তন করতে চান, তাহলে আপনি কাস্টম ডেসিরিয়ালাইজেশন ব্যবহার করতে পারেন।
উদাহরণ: Null Ignoring during Deserialization
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
String jsonWithNulls = "{\"name\":\"John\",\"address\":null,\"age\":25}";
// GsonBuilder দিয়ে Null গুলি উপেক্ষা না করে ডেসিরিয়ালাইজ করা
Gson gson = new Gson();
Person personWithNulls = gson.fromJson(jsonWithNulls, Person.class);
System.out.println("Deserialized with Nulls: " + personWithNulls);
// কাস্টম ডেসিরিয়ালাইজেশন ব্যবহার করে Null গুলি উপেক্ষা করতে পারেন
gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonDeserializer())
.create();
Person personWithDefault = gson.fromJson(jsonWithNulls, Person.class);
System.out.println("Deserialized with Defaults: " + personWithDefault);
}
}
class Person {
String name;
String address;
int age;
Person(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', address='" + address + "', age=" + age + "}";
}
}
class PersonDeserializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
String address = jsonObject.has("address") ? jsonObject.get("address").getAsString() : "No Address"; // Default value
int age = jsonObject.get("age").getAsInt();
return new Person(name, address, age);
}
}
আউটপুট:
Deserialized with Nulls: Person{name='John', address='null', age=25}
Deserialized with Defaults: Person{name='John', address='No Address', age=25}
ব্যাখ্যা:
- প্রথম
Personঅবজেক্টেaddressফিল্ডের মানnullথাকার কারণে এটিnullহিসেবে রূপান্তরিত হয়েছে। - দ্বিতীয় ক্ষেত্রে, কাস্টম
PersonDeserializerব্যবহার করেaddressএর জন্যnullএর বদলে "No Address" ডিফল্ট মান দেওয়া হয়েছে।
Gson দিয়ে Serialization এবং Deserialization এর সময় null মান উপেক্ষা (ignore) করার জন্য নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করা হয়:
- Serialization এ
serializeNulls()ব্যবহার করেnullমান সিরিয়ালাইজ করা বা উপেক্ষা করা। - Deserialization এর সময়
nullমান ডিফল্ট মানে পরিবর্তন করতে কাস্টম ডেসিরিয়ালাইজেশন ব্যবহার করা যেতে পারে।
এগুলি Gson কে আরও শক্তিশালী এবং নমনীয় করে তোলে, এবং প্রয়োজনে null মানকে উপেক্ষা বা নিয়ন্ত্রণ করা সম্ভব হয়।
Read more