Gson এর মাধ্যমে Complex Objects (যেমন, nested objects, lists, maps, এবং কাস্টম ক্লাস) কে Serialization (Object to JSON) এবং Deserialization (JSON to Object) করার জন্য কিছু বিশেষ টিপস এবং কৌশল রয়েছে যা আপনাকে সঠিকভাবে ডেটা প্রক্রিয়া করতে সাহায্য করবে। এগুলি বিভিন্ন ধরনের অবজেক্টের ক্ষেত্রে কার্যকরী, যেমন যেগুলিতে nested objects, collections, বা immutable objects অন্তর্ভুক্ত থাকে।
নিচে Complex Objects এর Serialization এবং Deserialization এর জন্য কিছু গুরুত্বপূর্ণ টিপস দেয়া হলো।
1. Use @SerializedName for Field Name Mapping
যখন আপনার JSON এর ফিল্ড নাম এবং Java ক্লাসের ফিল্ড নামের মধ্যে পার্থক্য থাকে, তখন @SerializedName অ্যানোটেশন ব্যবহার করুন। এটি JSON ডেটা এবং Java ফিল্ডের মধ্যে সঠিক ম্যাপিং নিশ্চিত করে।
উদাহরণ:
import com.google.gson.annotations.SerializedName;
public class Person {
@SerializedName("full_name")
private String name;
@SerializedName("years_old")
private int age;
// Constructor, Getter, and Setter methods
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
Serialization Example:
Person person = new Person("John Doe", 30);
Gson gson = new Gson();
String json = gson.toJson(person);
System.out.println(json);
Output:
{"full_name":"John Doe","years_old":30}
2. Handle Nested Objects Using Custom TypeAdapters
Nested objects (অথবা অন্য ক্লাস) সঠিকভাবে Deserialization এবং Serialization করার জন্য আপনি Custom TypeAdapter ব্যবহার করতে পারেন। এটি আপনার ক্লাসের জন্য কাস্টম লজিক প্রয়োগ করতে সাহায্য করে।
উদাহরণ:
ধরা যাক আপনার Person অবজেক্টে একটি Address অবজেক্ট রয়েছে, এবং আপনি চাইছেন JSON-এ একে সঠিকভাবে পার্স করতে।
public class Address {
private String street;
private String city;
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;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Address getAddress() {
return address;
}
}
Custom TypeAdapter for Address:
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;
public class AddressTypeAdapter implements JsonSerializer<Address>, JsonDeserializer<Address> {
@Override
public JsonElement serialize(Address address, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("street", address.getStreet());
jsonObject.addProperty("city", address.getCity());
return jsonObject;
}
@Override
public Address deserialize(JsonElement json, Type typeOfT, JsonSerializationContext context) {
JsonObject jsonObject = json.getAsJsonObject();
String street = jsonObject.get("street").getAsString();
String city = jsonObject.get("city").getAsString();
return new Address(street, city);
}
}
Register Custom TypeAdapter and Serialize/Deserialize:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Address.class, new AddressTypeAdapter())
.create();
Person person = new Person("John Doe", 30, new Address("123 Main St", "New York"));
// Serialize to JSON
String json = gson.toJson(person);
System.out.println(json);
// Deserialize from JSON
String personJson = "{\"name\":\"John Doe\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\"}}";
Person personDeserialized = gson.fromJson(personJson, Person.class);
Output:
{"name":"John Doe","age":30,"address":{"street":"123 Main St","city":"New York"}}
3. Use Collections (Lists, Maps) with Gson
যখন আপনি Collection (যেমন List, Map) কে JSON এ serialize বা deserialize করতে চান, Gson এ এটি সহজেই সমর্থিত। তবে, nested collection types বা কাস্টম collection types পার্স করতে আপনাকে কিছু টিপস অনুসরণ করতে হতে পারে।
Example: List of Persons
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("John Doe", 30, new Address("123 Main St", "New York")));
people.add(new Person("Jane Doe", 25, new Address("456 Oak St", "San Francisco")));
Gson gson = new Gson();
String json = gson.toJson(people);
System.out.println(json);
}
}
Output:
[
{"name":"John Doe","age":30,"address":{"street":"123 Main St","city":"New York"}},
{"name":"Jane Doe","age":25,"address":{"street":"456 Oak St","city":"San Francisco"}}
]
Example: Map of Objects
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Map<String, Person> personMap = new HashMap<>();
personMap.put("person1", new Person("John Doe", 30, new Address("123 Main St", "New York")));
personMap.put("person2", new Person("Jane Doe", 25, new Address("456 Oak St", "San Francisco")));
Gson gson = new Gson();
String json = gson.toJson(personMap);
System.out.println(json);
}
}
Output:
{
"person1":{"name":"John Doe","age":30,"address":{"street":"123 Main St","city":"New York"}},
"person2":{"name":"Jane Doe","age":25,"address":{"street":"456 Oak St","city":"San Francisco"}}
}
4. Use @Expose for Selective Field Serialization/Deserialization
@Expose অ্যানোটেশন দিয়ে আপনি নির্দিষ্ট ফিল্ডগুলোকে Serialization এবং Deserialization থেকে বাদ দিতে বা অন্তর্ভুক্ত করতে পারেন।
import com.google.gson.annotations.Expose;
public class Person {
@Expose
private String name;
@Expose
private int age;
@Expose(serialize = false, deserialize = false)
private String address; // Will not be serialized or deserialized
}
5. Handle Optional and Null Values
যখন আপনার JSON ডেটায় null বা optional মান থাকে, তখন আপনি Optional<T> ব্যবহার করে Gson কে null-safe ডেটা পার্স করতে বলতে পারেন।
import java.util.Optional;
public class Person {
private String name;
private Optional<Integer> age; // Age can be Optional
public Person(String name, Optional<Integer> age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Optional<Integer> getAge() {
return age;
}
}
6. Avoid Infinite Loops in Recursive References
যখন কোনো অবজেক্টের মধ্যে রিকার্সিভ রেফারেন্স থাকে (যেমন, একটি অবজেক্টের মধ্যে নিজের রেফারেন্স), তখন এটি infinite loop তৈরি করতে পারে। এটি এড়ানোর জন্য, আপনি @SerializedName, @Expose অথবা Transient ফিল্ড ব্যবহার করতে পারেন।
public class Node {
private String name;
private Node next; // This could cause recursion if not handled properly
// Constructor, getters, and setters
}
Gson দিয়ে Complex Objects এর Serialization এবং Deserialization করার সময় কিছু গুরুত্বপূর্ণ কৌশল ব্যবহার করতে পারেন:
- @SerializedName দিয়ে JSON এবং Java ফিল্ড নামের মধ্যে পার্থক্য ম্যানেজ করুন।
- Custom TypeAdapter ব্যবহার করে Nested Objects সঠিকভাবে Serialize এবং Deserialize করুন।
- Collections (List, Map) কে Gson দিয়ে সহজে পার্স করুন।
@Exposeঅ্যানোটেশন ব্যবহার করে নির্দিষ্ট ফিল্ডের Serialization এবং Deserialization কাস্টমাইজ করুন।- Optional এবং null values ঠিকভাবে হ্যান্ডেল করতে
Optional<T>ব্যবহার করুন। - Recursive references হ্যান্ডল করতে সাবধান থাকুন।
এই টিপসগুলো অনুসরণ করে আপনি Gson এর মাধ্যমে সহজেই Complex Objects কে Serialize এবং Deserialize করতে পারবেন।
Read more