Gson লাইব্রেরি ব্যবহার করার সময় Error Handling খুবই গুরুত্বপূর্ণ, কারণ JSON ডাটা পঠন বা লেখার সময় বিভিন্ন ধরনের ত্রুটি হতে পারে, যেমন অবৈধ JSON ফর্ম্যাট, প্রয়োজনীয় ফিল্ডের অভাব, বা ভুল ডাটা টাইপ। Gson কিছু টুল এবং কৌশল প্রদান করে যা আপনাকে এরর হ্যান্ডলিং করতে সাহায্য করে।
এখানে Gson ব্যবহার করার সময় Error Handling সম্পর্কে কিছু গুরুত্বপূর্ণ পদ্ধতি এবং কৌশল আলোচনা করা হলো:
1. JsonSyntaxException Handling
JsonSyntaxException Gson লাইব্রেরির একটি সাধারণ এক্সেপশন, যা ঘটে যখন JSON ডাটা সঠিকভাবে ফর্ম্যাট করা না থাকে। এটি সাধারণত ডেসিরিয়ালাইজেশন বা JSON পঠন করার সময় হয়। যেমন, JSON ফাইলটি যদি ভুল ফর্ম্যাটে থাকে (যেমন অতিরিক্ত কমা, ভুল কোটেশন মার্ক ইত্যাদি), তাহলে এই ত্রুটিটি ঘটবে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
public class GsonErrorHandlingExample {
public static void main(String[] args) {
String invalidJson = "{ \"name\": \"John\", \"age\": 30, }"; // Invalid JSON (extra comma)
Gson gson = new Gson();
try {
// Attempt to deserialize invalid JSON
Person person = gson.fromJson(invalidJson, Person.class);
} catch (JsonSyntaxException e) {
// Catch JSON syntax error
System.out.println("Error parsing JSON: " + e.getMessage());
}
}
}
class Person {
String name;
int age;
}
আউটপুট:
Error parsing JSON: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 36 path $.age
ব্যাখ্যা:
JsonSyntaxExceptionত্রুটিটি এখানে ঘটেছে কারণ JSON ডাটাতে অতিরিক্ত একটি কমা ছিল।- এই ধরনের ত্রুটি ধরতে, আমরা
try-catchব্লক ব্যবহার করে ত্রুটির বার্তা প্রদর্শন করেছি।
2. JsonParseException Handling
JsonParseException হলো আরেকটি সাধারণ ত্রুটি যা ঘটতে পারে যখন Gson JSON পঠন বা লেখার সময় সঠিকভাবে ডেটা ফর্ম্যাট করতে না পারে। এটি বিশেষভাবে তখন ঘটবে যখন JSON স্ট্রিমের মধ্যে অবৈধ বা অসম্পূর্ণ তথ্য থাকে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
public class GsonParseExceptionExample {
public static void main(String[] args) {
String invalidJson = "{ \"name\": \"John\", \"age\": "; // Incomplete JSON
Gson gson = new Gson();
try {
// Attempt to deserialize incomplete JSON
Person person = gson.fromJson(invalidJson, Person.class);
} catch (JsonParseException e) {
// Catch JSON parse error
System.out.println("Error parsing JSON: " + e.getMessage());
}
}
}
আউটপুট:
Error parsing JSON: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 27 path $
ব্যাখ্যা:
JsonParseExceptionঘটেছে কারণ JSON স্ট্রিংটি অসম্পূর্ণ ছিল এবং Gson পঠন করতে পারে নি।- এই ধরনের ত্রুটি ক্ষেত্রেও,
try-catchব্লক ব্যবহার করে ত্রুটির বার্তা পাওয়া গেছে।
3. Default Value ব্যবহার করা
কখনো কখনো JSON ডাটাতে কিছু ফিল্ড অনুপস্থিত থাকতে পারে, অথবা null হতে পারে। এই ক্ষেত্রে, আপনি default value ব্যবহার করে সেই ফিল্ডগুলোকে নিরাপদভাবে হ্যান্ডল করতে পারেন।
উদাহরণ:
import com.google.gson.Gson;
public class GsonDefaultValueExample {
public static void main(String[] args) {
String json = "{ \"name\": \"John\" }"; // Missing 'age' field
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println("Name: " + person.name);
System.out.println("Age: " + person.age); // This will print 0 because age is missing in JSON
}
}
class Person {
String name;
int age = 0; // Default value for 'age'
}
আউটপুট:
Name: John
Age: 0
ব্যাখ্যা:
Personক্লাসেageফিল্ডের জন্য একটি default value দেওয়া হয়েছে, যাতে JSON ডাটাতেageফিল্ড অনুপস্থিত থাকলে তা0দিয়ে পূর্ণ হয়।
4. JsonElement ব্যবহার করে error handling
আপনি কখনো কখনো JSON ডাটা থেকে নির্দিষ্ট ফিল্ড নিয়ে কাজ করতে পারেন, এবং যদি সেই ফিল্ডটি না পাওয়া যায়, তবে JsonElement ব্যবহার করে আপনি null চেক করতে পারেন এবং ত্রুটির মোকাবিলা করতে পারেন।
উদাহরণ:
import com.google.gson.*;
public class GsonElementErrorHandlingExample {
public static void main(String[] args) {
String json = "{ \"name\": \"John\" }"; // Missing 'age' field
Gson gson = new Gson();
JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
// Accessing a field safely using JsonElement
JsonElement ageElement = jsonObject.get("age");
if (ageElement != null && !ageElement.isJsonNull()) {
System.out.println("Age: " + ageElement.getAsInt());
} else {
System.out.println("Age field is missing or null.");
}
}
}
আউটপুট:
Age field is missing or null.
ব্যাখ্যা:
JsonElementব্যবহার করে আপনি নির্দিষ্ট ফিল্ডটি পেতে পারেন এবং সেটাnullকিনা বা উপস্থিত কিনা চেক করতে পারেন। যদি ফিল্ডটি না থাকে, তবে আপনি কাস্টম বার্তা দিতে পারেন।
5. @SerializedName এবং @JsonAdapter এর মাধ্যমে Error Handling
কখনো কখনো আপনি JSON ফিল্ডের নাম বা ফরম্যাটের কারণে সমস্যা দেখতে পারেন। এই ধরনের সমস্যা হ্যান্ডল করার জন্য আপনি @SerializedName অথবা @JsonAdapter ব্যবহার করে কাস্টম ম্যাপিং এবং ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করতে পারেন।
উদাহরণ:
import com.google.gson.*;
import com.google.gson.annotations.SerializedName;
public class GsonAdapterErrorHandlingExample {
public static void main(String[] args) {
String json = "{ \"first_name\": \"John\" }"; // Missing 'last_name' field
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println("First Name: " + person.firstName);
System.out.println("Last Name: " + person.lastName); // This will print 'null' because 'last_name' is missing
}
}
class Person {
@SerializedName("first_name")
String firstName;
@SerializedName("last_name")
String lastName = "Unknown"; // Default value if 'last_name' is missing
}
আউটপুট:
First Name: John
Last Name: Unknown
ব্যাখ্যা:
@SerializedNameব্যবহার করে, JSON ফিল্ড নামের সাথে Java ফিল্ড নামের ম্যাপিং করা হয়েছে। যদিlast_nameফিল্ডটি JSON এ না থাকে, তবে এটিUnknownহিসেবে ডিফল্ট মান নিবে।- Error Handling Gson এ JSON পঠন এবং লেখার সময় গুরুত্বপূর্ণ, কারণ JSON ডাটা অবৈধ বা অসম্পূর্ণ হতে পারে।
JsonSyntaxExceptionএবংJsonParseExceptionদিয়ে আপনি JSON সিনট্যাক্স এবং পার্সিংয়ের ত্রুটি ধরতে পারেন।- Default values এবং
JsonElementব্যবহার করে আপনি অনুপস্থিত বাnullফিল্ডের সমস্যা নিরাপদে হ্যান্ডল করতে পারেন। @SerializedNameএবং@JsonAdapterব্যবহার করে JSON ফিল্ডের কাস্টম ম্যাপিং এবং ডেসিরিয়ালাইজেশন লজিক প্রয়োগ করা সম্ভব।
এই কৌশলগুলির মাধ্যমে আপনি Gson এর সাথে কাজ করার সময় বিভিন্ন ধরনের ত্রুটি সহজেই মোকাবিলা করতে পারবেন।
Gson ব্যবহারের সময় কিছু সাধারণ ত্রুটি বা exceptions দেখা দিতে পারে। এগুলি সাধারণত Serialization, Deserialization, TypeMismatch ইত্যাদি কারণে ঘটে থাকে। নিচে কিছু সাধারণ Gson ত্রুটি এবং exception handling সম্বন্ধে আলোচনা করা হয়েছে।
1. JsonSyntaxException
JsonSyntaxException ত্রুটিটি তখন ঘটে যখন JSON ডেটা সঠিকভাবে ফরম্যাট করা হয় না বা ভুল সিনট্যাক্স ব্যবহার করা হয়। এটি JSON স্ট্রিং পাড়ার সময় ঘটতে পারে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
public class Main {
public static void main(String[] args) {
String invalidJson = "{\"name\":\"John Doe\", \"age\":30"; // Missing closing bracket
Gson gson = new Gson();
try {
// Invalid JSON, missing closing bracket
Person person = gson.fromJson(invalidJson, Person.class);
} catch (JsonSyntaxException e) {
System.out.println("Invalid JSON syntax: " + e.getMessage());
}
}
}
ত্রুটি:
Invalid JSON syntax: com.google.gson.stream.MalformedJsonException: Expected '}' at line 1 column 35 path $.age
2. JsonParseException
JsonParseException সাধারণত JsonSyntaxException এর অধীনে আসে, তবে এটি JSON ডেটার ভুল ফরম্যাটে আসার কারণে বা অন্য কোনো পার্সিং সমস্যার কারণে ঘটতে পারে। এটি JSON ডেটাকে ঠিকভাবে পার্স করতে না পারলে ঘটে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
public class Main {
public static void main(String[] args) {
String invalidJson = "{\"name\":\"John Doe\", \"age\":\"abc\"}"; // age should be an integer
Gson gson = new Gson();
try {
Person person = gson.fromJson(invalidJson, Person.class);
} catch (JsonParseException e) {
System.out.println("Error parsing JSON: " + e.getMessage());
}
}
}
ত্রুটি:
Error parsing JSON: java.lang.NumberFormatException: For input string: "abc"
3. JsonIOException
JsonIOException তখন ঘটে যখন I/O অপারেশন চলাকালীন JSON ডেটা রিড বা রাইট করতে কোনো সমস্যা হয়। এটি সাধারণত ফাইল থেকে JSON পড়ার বা লিখার সময় ঘটে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (FileReader reader = new FileReader("non_existent_file.json")) {
Gson gson = new Gson();
Person person = gson.fromJson(reader, Person.class);
} catch (IOException | JsonIOException e) {
System.out.println("Error reading/writing JSON file: " + e.getMessage());
}
}
}
ত্রুটি:
Error reading/writing JSON file: java.io.FileNotFoundException: non_existent_file.json (No such file or directory)
4. JsonNull (Null values in JSON)
যখন JSON ডেটাতে কোনো ফিল্ড null থাকে, এবং সেই ফিল্ডটি Java অবজেক্টে primitive type (যেমন int, double, etc.) হিসেবে মানচিত্রিত করতে চেষ্টা করা হয়, তখন এটি NullPointerException বা Gson এর পক্ষ থেকে সঠিকভাবে হ্যান্ডেল না হওয়া বিষয় হতে পারে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonNull;
public class Main {
public static void main(String[] args) {
String json = "{\"age\":null}";
Gson gson = new Gson();
try {
Person person = gson.fromJson(json, Person.class); // Missing non-nullable fields may cause issues
} catch (NullPointerException e) {
System.out.println("Null value encountered: " + e.getMessage());
}
}
}
ত্রুটি:
Null value encountered: Cannot assign null to primitive type
5. IllegalStateException
IllegalStateException তখন ঘটে যখন Gson এর কোনো অবস্থা অবৈধ হয় বা API এর নিয়ম-নীতি অনুযায়ী কোনো অপারেশন করা যায় না। সাধারণত, JSON ডেটা প্রক্রিয়া করার সময় যখন আপনি কোনো অবৈধ JSON পদ্ধতি ব্যবহার করেন তখন এটি হতে পারে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
public class Main {
public static void main(String[] args) {
String json = "{\"name\": \"John\", \"age\": 30}";
Gson gson = new Gson();
JsonElement element = gson.toJsonTree(json);
try {
// Trying to parse a JsonElement that was not parsed correctly
JsonObject jsonObject = element.getAsJsonObject();
} catch (IllegalStateException e) {
System.out.println("Illegal state while parsing JSON: " + e.getMessage());
}
}
}
ত্রুটি:
Illegal state while parsing JSON: Not a JSON Object: "name": "John", "age": 30
6. TypeMismatchException
TypeMismatchException তখন ঘটে যখন JSON ডেটার ধরনের সাথে Java অবজেক্টের ধরন মেলে না। যেমন, যদি JSON এ একটি স্ট্রিং দেয়া থাকে, কিন্তু Java ক্লাসে সেটি একটি int হিসেবে অ্যাক্সেস করতে চান, তখন এটি ঘটতে পারে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
public class Main {
public static void main(String[] args) {
String json = "{\"age\":\"30\"}"; // age is a String in JSON
Gson gson = new Gson();
try {
Person person = gson.fromJson(json, Person.class); // Expecting an int, but it's a String
} catch (JsonSyntaxException e) {
System.out.println("Type mismatch: " + e.getMessage());
}
}
}
ত্রুটি:
Type mismatch: java.lang.NumberFormatException: For input string: "30"
7. UnsupportedOperationException
UnsupportedOperationException তখন ঘটে যখন আপনি Gson এর কোনো অপারেশন চেষ্টা করেন যা সাপোর্টেড নয়। এটি সাধারণত Gson এর ভিতরের কিছু ত্রুটি বা কিছু নির্দিষ্ট অপারেশন কার্যকরী না হওয়াতে ঘটে।
উদাহরণ:
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\"}";
Gson gson = new Gson();
JsonElement element = gson.fromJson(json, JsonElement.class);
try {
element.getAsJsonObject().addProperty("age", 30);
} catch (UnsupportedOperationException e) {
System.out.println("Operation not supported: " + e.getMessage());
}
}
}
ত্রুটি:
Operation not supported: JSON element is not a JSON object
Exception Handling এর জন্য কিছু টিপস:
try-catchব্লক ব্যবহার করুন: Gson এর সাথে কাজ করার সময় প্রায়ই JsonParseException, JsonSyntaxException, JsonIOException ইত্যাদি ত্রুটি ঘটতে পারে, তাই এগুলি সঠিকভাবে হ্যান্ডল করতেtry-catchব্লক ব্যবহার করুন।- Null এবং TypeMismatch: JSON ডেটায় যখন
nullথাকে বা ধরনের পার্থক্য থাকে, তখন সাবধান থাকুন এবং Optional বা Null checks ব্যবহার করুন। - Logging: ত্রুটির সঠিক তথ্য ট্র্যাক করতে
Loggerব্যবহার করতে পারেন, যাতে আপনি বুঝতে পারেন কোথায় এবং কেন ত্রুটি ঘটছে।
Gson এর সাথে কাজ করার সময় বিভিন্ন ধরনের ত্রুটি বা exceptions দেখা দিতে পারে, যেমন JsonSyntaxException, JsonParseException, JsonIOException, ইত্যাদি। এগুলির সঠিকভাবে মোকাবিলা করতে exception handling ব্যবহার করা উচিত যাতে JSON ডেটার সঠিক পার্সিং এবং Serialization/Deserialization প্রক্রিয়া বজায় থাকে।
Gson-এ JSON Parsing Exception সাধারণত ঘটে যখন JSON ডেটা সঠিক ফরম্যাটে না থাকে বা কোনো অপ্রত্যাশিত সমস্যা ঘটে, যেমন অবৈধ টাইপের ডেটা, সঠিক JSON স্ট্রাকচার না থাকা ইত্যাদি। Gson JSON ডেটা পার্সিং করতে গিয়ে JsonParseException বা JsonSyntaxException ছুঁড়ে দেয় যদি JSON সঠিকভাবে ফরম্যাট না হয়।
নিচে কিছু সাধারণ JSON Parsing Exception এবং তাদের সম্ভাব্য সমাধানগুলো আলোচনা করা হলো।
1. Invalid JSON Format (অবৈধ JSON ফরম্যাট)
একটি সাধারণ সমস্যা হলো JSON ডেটা সঠিকভাবে ফরম্যাট করা না হওয়া। উদাহরণস্বরূপ, যদি JSON অবজেক্টের মধ্যে অতিরিক্ত কমা থাকে বা বন্ধনী সঠিকভাবে বন্ধ না থাকে, তাহলে পার্সিং সমস্যা হতে পারে।
উদাহরণ:
String invalidJson = "{\"name\":\"John\", \"age\":30,}"; // অতিরিক্ত কমা
Gson gson = new Gson();
Person person = gson.fromJson(invalidJson, Person.class); // JsonSyntaxException হবে
সমাধান:
JSON ফরম্যাট সঠিকভাবে চেক করুন এবং অতিরিক্ত কমা বা ভুল বন্ধনী (brackets) বাদ দিন। সঠিক JSON ফরম্যাট হবে:
{"name":"John", "age":30}
2. Mismatched Data Types (ডেটা টাইপের অসঙ্গতি)
যখন JSON ডেটা থেকে ডেসিরিয়ালাইজ করা হয় এবং অবজেক্টের মধ্যে প্রত্যাশিত টাইপের সাথে ডেটা টাইপ মেলে না, তখন JsonSyntaxException হতে পারে।
উদাহরণ:
String json = "{\"name\":\"John\", \"age\":\"thirty\"}"; // 'age' একটি স্ট্রিং, কিন্তু এটি একটি সংখ্যা হওয়া উচিত
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class); // JsonSyntaxException
সমাধান:
সুনির্দিষ্ট টাইপের সাথে মিলিয়ে JSON ডেটা প্রদান করুন। age এখানে একটি integer হওয়া উচিত।
{"name":"John", "age":30}
এবং Person ক্লাসে নিশ্চিত করুন যে age একটি int বা Integer টাইপ।
3. Missing Required Fields (আবশ্যক ক্ষেত্রের অনুপস্থিতি)
যদি আপনি JSON ডেটার মধ্যে required ফিল্ড মিস করেন এবং সেই ফিল্ডের জন্য কোনো ডিফল্ট মান বা কাস্টম হ্যান্ডলিং না থাকে, তবে Gson ডেসিরিয়ালাইজ করার সময় ত্রুটি সৃষ্টি হতে পারে।
উদাহরণ:
String json = "{\"name\":\"John\"}"; // age ফিল্ড অনুপস্থিত
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class); // JsonSyntaxException হতে পারে যদি age ফিল্ড মিসিং থাকে
সমাধান:
আপনি যদি required ফিল্ডের জন্য ডিফল্ট মান ব্যবহার করতে চান, তাহলে GsonBuilder এ @SerializedName বা @Expose ব্যবহার করতে পারেন, অথবা কাস্টম Deserializer তৈরি করতে পারেন। অথবা null মানের জন্য ডিফল্ট মানে Optional বা Integer টাইপ ব্যবহার করুন।
4. Unexpected JSON Structure (অপ্রত্যাশিত JSON স্ট্রাকচার)
কিছু সময় JSON ডেটা স্ট্রাকচার আপনার প্রোগ্রামের কাঠামো অনুযায়ী নাও থাকতে পারে। উদাহরণস্বরূপ, যদি আপনি একটি List এর মধ্যে একটি অবজেক্ট প্রাপ্ত হওয়ার প্রত্যাশা করেন কিন্তু একটি JSON অবজেক্ট বা অ্যারে অন্যভাবে আসে, তাহলে পার্সিং এর সময় JsonSyntaxException ঘটতে পারে।
উদাহরণ:
String json = "{\"person\": {\"name\":\"John\", \"age\":30}}"; // এটি একটি nested object
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class); // JsonSyntaxException যদি Person এর জন্য প্রপার কাঠামো না থাকে
সমাধান:
এই সমস্যাটি Person ক্লাসের জন্য কাঠামো মেলাতে হবে এবং @SerializedName ব্যবহার করতে হতে পারে।
class Person {
private String name;
private int age;
@SerializedName("person") // nested object এর জন্য সঠিক name উল্লেখ করুন
private Person person;
// getter/setter methods
}
5. Invalid JSON Format (অবৈধ ফরম্যাটে String, Boolean বা Null Value)
যদি JSON ফরম্যাটে একটি null, boolean, বা string টাইপের ভুল উপস্থাপন থাকে, তাহলে পার্সিং এর সময় ত্রুটি হতে পারে।
উদাহরণ:
String json = "{\"name\":null, \"age\":30}";
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class); // যদি null ফিল্ড হ্যান্ডলিং না করা হয়
সমাধান:
আপনি যদি null মানকে সঠিকভাবে হ্যান্ডেল করতে চান, তাহলে GsonBuilder-এ serializeNulls() ফিচার ব্যবহার করতে পারেন অথবা কাস্টম Deserializer তৈরি করে এটি হ্যান্ডেল করতে পারেন।
6. NullPointerException বা TypeMismatchException
যদি আপনি ভুল টাইপের ডেটা পাঠানোর চেষ্টা করেন (যেমন, একটি JSON অ্যারে পাঠানোর সময় যখন আপনি একটি অবজেক্টের জন্য ডেসিরিয়ালাইজ করার চেষ্টা করছেন), তখন NullPointerException বা TypeMismatchException দেখা দিতে পারে।
উদাহরণ:
String json = "[{\"name\":\"John\", \"age\":30}]"; // JSON অ্যারে
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class); // TypeMismatchException
সমাধান:
এটি List হিসেবে ডেসিরিয়ালাইজ করুন যদি JSON অ্যারে থাকে।
String json = "[{\"name\":\"John\", \"age\":30}]";
Gson gson = new Gson();
List<Person> personList = gson.fromJson(json, new TypeToken<List<Person>>() {}.getType()); // সঠিক টাইপ ব্যবহার
7. Common Parsing Exception এবং তাদের সমাধান
| Exception | সমস্যা | সমাধান |
|---|---|---|
| JsonSyntaxException | JSON ফরম্যাট সঠিক না হওয়া (অতিরিক্ত কমা, বন্ধনী সমস্যা) | JSON ডেটা ফরম্যাট ঠিক করে দিন। |
| JsonParseException | অবৈধ JSON টাইপ বা কাঠামো (যেমন, ডেটা টাইপ মেলে না) | JSON ডেটার কাঠামো সঠিক করুন, ফিল্ডের টাইপ ঠিক করুন। |
| TypeMismatchException | টাইপের মধ্যে অসঙ্গতি (যেমন, একটি string দেয়া হচ্ছে, কিন্তু এটি Integer হওয়া উচিত) | সঠিক টাইপ নিশ্চিত করুন, ডেটা ফরম্যাট চেক করুন। |
| NullPointerException | null মান ডেসিরিয়ালাইজ করতে গিয়ে সমস্যা | null মানের জন্য ডিফল্ট মান ব্যবহারের জন্য কাস্টম Deserializer তৈরি করুন। |
| ValidationException | JSON Schema যাচাই করতে গিয়ে সমস্যা | JSON Schema এর কাঠামো সঠিকভাবে তৈরি এবং মিলিয়ে JSON ডেটা পাঠান। |
সারাংশ
Gson-এ JSON Parsing Exception সাধারণত JSON ডেটার ফরম্যাট, টাইপের অসঙ্গতি, বা কাঠামোর ভুল কারণে হয়। আপনি এই ধরনের ত্রুটিগুলি সঠিকভাবে ট্রাবলশুট করতে পারেন:
- JSON ডেটার ফরম্যাট সঠিক কিনা চেক করুন।
- টাইপ মেলানো এবং কাঠামো ঠিক করতে কাস্টম Deserializer/Serializer ব্যবহার করুন।
- Gson-এ সঠিক TypeToken ব্যবহার করে অ্যারে এবং অবজেক্ট ডেসিরিয়ালাইজ করতে ভুলবেন না।
Gson লাইব্রেরি ব্যবহারের সময় custom error messages এবং exception handling করা একটি গুরুত্বপূর্ণ দিক, কারণ JSON serialization/deserialization প্রক্রিয়ায় বিভিন্ন ধরনের সমস্যা দেখা দিতে পারে, যেমন invalid JSON format, type mismatch, বা missing fields। Gson সাধারণত JsonParseException বা JsonSyntaxException ছুঁড়ে দেয় যখন কোনো সমস্যা হয়, তবে আপনি custom error messages তৈরি করতে এবং এই ধরনের exceptions সুন্দরভাবে হ্যান্ডেল করতে পারেন।
এখানে, Gson এর exception handling এবং custom error messages হ্যান্ডল করার কিছু কৌশল তুলে ধরা হলো।
1. Custom Exception Handling in Gson
Gson ডিফল্টভাবে কিছু exception (যেমন JsonParseException, JsonSyntaxException) ছুঁড়ে দেয় যখন কিছু ভুল থাকে। আপনি কাস্টম exception handling ব্যবহার করে সেগুলিকে নিজের মতো করে প্রক্রিয়া করতে পারেন।
উদাহরণ: JsonParseException হ্যান্ডলিং
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
Gson gson = new Gson();
String invalidJson = "{name: 'John', age: 30}"; // Invalid JSON (missing quotes around key)
try {
Person person = gson.fromJson(invalidJson, Person.class);
} catch (JsonSyntaxException e) {
// Handle the error with a custom message
System.out.println("Custom Error: Invalid JSON format. Please check the syntax.");
e.printStackTrace();
}
}
}
class Person {
String name;
int age;
}
কোডের ব্যাখ্যা:
- এখানে invalidJson একটি ভুল JSON স্ট্রিং যা সঠিকভাবে ফর্ম্যাট করা হয়নি (কী গুলি কোডে উদ্ধৃতি চিহ্নে নেই)।
- JsonSyntaxException এ ধরনের সমস্যা সনাক্ত করতে ব্যবহৃত হয়, এবং আপনি এটি try-catch ব্লকের মাধ্যমে হ্যান্ডল করতে পারেন।
- custom error message প্রদান করা হয়েছে
Custom Error: Invalid JSON format. Please check the syntax.এবং stack trace দেখানো হয়েছে।
আউটপুট:
Custom Error: Invalid JSON format. Please check the syntax.
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $
...
2. Custom Error Messages with JsonDeserializer
আপনি custom error messages সরাসরি JsonDeserializer ব্যবহার করে তৈরি করতে পারেন, যখন আপনি JSON ডেটাকে Java অবজেক্টে deserialize করেন।
উদাহরণ: Custom Error Messages with JsonDeserializer
import com.google.gson.*;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonDeserializer())
.create();
String invalidJson = "{\"name\":\"John\", \"age\":\"twenty\"}"; // Invalid age
try {
Person person = gson.fromJson(invalidJson, Person.class);
System.out.println(person);
} catch (JsonParseException e) {
// Custom error message
System.out.println("Custom Error: Failed to deserialize JSON due to invalid data type for 'age'.");
e.printStackTrace();
}
}
}
// Person class
class Person {
String name;
int age;
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
// Custom JsonDeserializer for Person class
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();
try {
int age = jsonObject.get("age").getAsInt(); // Trying to parse age
return new Person(name, age);
} catch (NumberFormatException e) {
// Handle invalid data type error with a custom message
throw new JsonParseException("Custom Error: Invalid data type for 'age'. Expected an integer.", e);
}
}
}
কোডের ব্যাখ্যা:
- PersonDeserializer কাস্টম JsonDeserializer তৈরি করা হয়েছে, যেখানে আমরা age ফিল্ডের জন্য NumberFormatException ক্যাচ করেছি, যদি JSON ডেটাতে age ফিল্ডের মান সঠিক সংখ্যায় না হয়।
- কাস্টম JsonParseException তৈরি করে আমরা custom error message প্রদান করেছি:
"Custom Error: Invalid data type for 'age'. Expected an integer."
আউটপুট:
Custom Error: Failed to deserialize JSON due to invalid data type for 'age'.
com.google.gson.JsonParseException: Custom Error: Invalid data type for 'age'. Expected an integer.
3. JsonReader এর মাধ্যমে Custom Error Messages
যখন আপনি JsonReader দিয়ে JSON ডেটা স্ট্রিমের মাধ্যমে পড়ছেন, তখন আপনি JsonReader এর beginObject(), endObject(), nextName() ইত্যাদি মেথডগুলো ব্যবহার করে কাস্টম exception handling করতে পারেন।
উদাহরণ: JsonReader দিয়ে Custom Error Messages
import com.google.gson.stream.JsonReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String invalidJson = "{\"name\": \"John\", \"age\": \"twenty\"}"; // Invalid JSON format for 'age'
JsonReader reader = new JsonReader(new StringReader(invalidJson));
try {
reader.beginObject(); // Start reading the JSON object
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
String value = reader.nextString();
System.out.println("Name: " + value);
} else if (name.equals("age")) {
try {
int age = reader.nextInt(); // Trying to read 'age' as an integer
System.out.println("Age: " + age);
} catch (NumberFormatException e) {
throw new JsonParseException("Custom Error: Invalid data type for 'age'. Expected an integer.", e);
}
}
}
reader.endObject();
} catch (IOException | JsonParseException e) {
// Handle exceptions
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
কোডের ব্যাখ্যা:
- JsonReader ব্যবহার করে JSON স্ট্রিম থেকে একে একে ডেটা পড়া হচ্ছে।
- যদি age ফিল্ডের জন্য NumberFormatException ঘটে (যেমন, যদি এটি একটি স্ট্রিং হয়), তাহলে আমরা একটি কাস্টম JsonParseException ছুঁড়ে দিচ্ছি এবং কাস্টম error message প্রদান করছি।
আউটপুট:
Custom Error: Invalid data type for 'age'. Expected an integer.
com.google.gson.JsonParseException: Custom Error: Invalid data type for 'age'. Expected an integer.
4. Custom Exception Handling for Missing Fields
আপনি required fields এর জন্য কাস্টম exception handling করতে পারেন, যেখানে missing fields এর জন্য একটি কাস্টম ত্রুটি তৈরি করা হয়।
উদাহরণ: Missing Fields এর জন্য Custom Exception
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
Gson gson = new Gson();
String invalidJson = "{\"name\": \"John\"}"; // Missing 'age' field
try {
Person person = gson.fromJson(invalidJson, Person.class);
if (person.getAge() == 0) { // Check if age is missing or invalid
throw new JsonParseException("Custom Error: Missing required field 'age'.");
}
System.out.println(person);
} catch (JsonParseException e) {
// Handle the error with a custom message
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
কোডের ব্যাখ্যা:
- Missing Fields: আমরা একটি JSON ডেটা দিয়ে ডেসেরিয়ালাইজ করেছি যেখানে
ageফিল্ডটি অনুপস্থিত। - JsonParseException ছুঁড়ে দেওয়া হয়েছে যদি
ageফিল্ডটি missing থাকে বা invalid হয়।
আউটপুট:
Custom Error: Missing required field 'age'.
com.google.gson.JsonParseException: Custom Error: Missing required field 'age'.
- Custom error messages এবং exception handling Gson এর সাথে কাজ করার সময় গুরুত্বপূর্ণ, বিশেষ করে যখন ডেটার ফরম্যাট, টাইপ বা অন্যান্য বিষয়গত সমস্যা ঘটে।
- JsonParseException, JsonSyntaxException, এবং NumberFormatException এর মতো সাধারণ ত্রুটিগুলি কাস্টম মেসেজ সহ হ্যান্ডল করতে পারলে ব্যবহারকারীদের জন্য আরো সহায়ক এবং সুস্পষ্ট ত্রুটি বার্তা প্রদান করা সম্ভব।
- JsonDeserializer, JsonReader, এবং TypeAdapter এর মাধ্যমে কাস্টম exception handling আরো উন্নত করা যেতে পারে।
Gson-এ Invalid JSON এবং Missing Fields হ্যান্ডল করা একটি সাধারণ কিন্তু গুরুত্বপূর্ণ টপিক, বিশেষত যখন আপনি JSON ডেটা থেকে Java অবজেক্টে রূপান্তর করছেন। এই পরিস্থিতিগুলো মোকাবেলা করার জন্য আপনাকে custom error handling এবং null safety ব্যবহার করতে হতে পারে।
Invalid JSON হ্যান্ডলিং
Invalid JSON-এর ক্ষেত্রে, Gson JsonParseException ছুড়ে দেয়। আপনি এই এক্সসেপশনটি কাস্টমাইজ করে বা সঠিকভাবে হ্যান্ডল করে JSON প্যার্সিং প্রক্রিয়া চালাতে পারেন।
1. Invalid JSON Example:
ধরা যাক, আপনি একটি Person ক্লাস তৈরি করেছেন:
class Person {
String name;
int age;
}
এখন, যদি JSON ডেটা ভুলভাবে ফর্ম্যাট করা হয়, যেমন:
{
"name": "John",
"age": "thirty"
}
এখানে age একটি স্ট্রিং হিসাবে দেওয়া হয়েছে, অথচ age একটি ইন্টিজার হওয়া উচিত।
Error Handling for Invalid JSON:
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\",\"age\":\"thirty\"}";
Gson gson = new Gson();
try {
Person person = gson.fromJson(json, Person.class);
System.out.println(person.name + " " + person.age);
} catch (JsonSyntaxException e) {
System.out.println("Invalid JSON: " + e.getMessage());
}
}
}
Output:
Invalid JSON: java.lang.NumberFormatException: For input string: "thirty"
এখানে, JsonSyntaxException এর মাধ্যমে invalid JSON ত্রুটি সঠিকভাবে হ্যান্ডল করা হয়েছে।
2. Missing Fields হ্যান্ডলিং
Missing fields-এর ক্ষেত্রে, Gson null বা default values ব্যবহার করে। আপনি চাইলে কাস্টম JsonDeserializer ব্যবহার করে মিসিং ফিল্ডের জন্য ডিফল্ট মান দিতে পারেন।
Missing Fields Example:
ধরা যাক, Person ক্লাসে name, age, এবং email ফিল্ড রয়েছে, এবং আপনি যদি JSON ডেটাতে email ফিল্ড না পান, তাহলে আপনি একটি ডিফল্ট মান সেট করতে চান।
class Person {
String name;
int age;
String email;
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
এখন, যদি JSON ডেটা থেকে email ফিল্ড মিসিং থাকে:
{
"name": "John",
"age": 30
}
Custom Deserializer for Missing Fields:
import com.google.gson.*;
import java.lang.reflect.Type;
public 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();
int age = jsonObject.get("age").getAsInt();
// If email is missing, set a default value
String email = jsonObject.has("email") ? jsonObject.get("email").getAsString() : "default@example.com";
return new Person(name, age, email);
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\",\"age\":30}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonDeserializer()) // Custom Deserializer
.create();
Person person = gson.fromJson(json, Person.class);
System.out.println(person.name + ", " + person.age + ", " + person.email);
}
}
Output:
John, 30, default@example.com
এখানে, email ফিল্ড মিসিং থাকলে আমরা সেটিকে default@example.com দিয়ে প্রতিস্থাপন করেছি।
3. Gson এর সাথে Optional Fields হ্যান্ডলিং:
যদি আপনি চান যে JSON ডেটা থেকে Optional fields স্বয়ংক্রিয়ভাবে null মান গ্রহণ করুক, তাহলে আপনি @SerializedName অ্যানোটেশন ব্যবহার করতে পারেন, বা JSON ডেটা ডেসিরিয়ালাইজ করার সময় Optional টাইপ ব্যবহার করতে পারেন।
Optional Fields Example:
import com.google.gson.annotations.SerializedName;
class Person {
String name;
int age;
@SerializedName("email") // Optional field with default value
String email = "default@example.com";
}
এখানে, যদি email ফিল্ড JSON ডেটাতে না থাকে, তবে email ফিল্ডে default@example.com মান দেওয়া হবে।
4. Gson থেকে Custom Error Handling
আপনি চাইলে Gson এর মাধ্যমে কাস্টম error handling মেকানিজমও তৈরি করতে পারেন, যেখানে JSON ডেটা প্রসেস করার সময় বিশেষভাবে কিছু কাস্টম মেসেজ অথবা এক্সসেপশন রোল আউট করা হয়। নিচে একটি উদাহরণ:
import com.google.gson.*;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"age\":\"invalidAge\"}"; // Invalid value for age
Gson gson = new Gson();
try {
Person person = gson.fromJson(json, Person.class);
System.out.println(person.name + ", " + person.age);
} catch (JsonSyntaxException e) {
System.out.println("Custom Error - Invalid JSON Format: " + e.getMessage());
}
}
}
Output:
Custom Error - Invalid JSON Format: java.lang.NumberFormatException: For input string: "invalidAge"
সংক্ষেপে:
- Invalid JSON Handling: Invalid JSON প্যার্সিং করার সময়
JsonSyntaxExceptionবাJsonParseExceptionব্যবহার করে ত্রুটি হ্যান্ডল করা হয়। - Missing Fields Handling: Missing fields-এর জন্য আপনি custom deserializer ব্যবহার করে ডিফল্ট মান প্রদান করতে পারেন।
- Optional Fields: Optional fields-এর জন্য আপনি
Optionalটাইপ বা@SerializedNameঅ্যানোটেশন ব্যবহার করতে পারেন, যাতে মিসিং ফিল্ডে ডিফল্ট মান ব্যবহার করা হয়। - Error Handling: Gson দিয়ে JSON ডেসিরিয়ালাইজ করার সময় কাস্টম এক্সসেপশন হ্যান্ডলিং করা যেতে পারে, যা আপনি স্পেসিফিক ত্রুটি বার্তা দিতে পারেন।
এভাবে invalid JSON এবং missing fields হ্যান্ডল করে আপনি আরও নির্ভরযোগ্য এবং প্রেডিক্টেবল JSON প্রক্রিয়াকরণ করতে পারবেন।
Read more