ডিসিরিয়ালাইজেশনের সময় Gson একটি JSON অবজেক্ট এক্সপেক্ট করতে পারে কিন্তু JSON অ্যারে পায়। যেহেতু এটি একটু অন্যটিতে কনভার্ট করতে পারে না, তাই রানটাইমে JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY এরর নিক্ষেপ করে।
এরর উদাহরণ
import com.google.gson.Gson;
public class GsonErrorTest {
public static void main(String args[]) throws Exception {
String json = "{\"employee\":[{\"name\":\"Raja Ramesh\", \"technology\":\"java\"}]}";
Gson gson = new Gson();
Software software = gson.fromJson(json, Software.class);
System.out.println(software);
}
}
class Software {
Employee employee; // একক Employee অবজেক্ট এক্সপেক্ট করছে
}
class Employee {
String name;
String technology;
}
এরর আউটপুট
Exception in thread "main"
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY
at line 1 column 14
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(...)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY
at line 1 column 14
at com.google.gson.stream.JsonReader.expect(JsonReader.java:339)
সমাধান: POJO টাইপ পরিবর্তন করুন
একক অবজেক্টের বদলে Collection বা Array টাইপ ব্যবহার করুন। নিচে List কালেকশন ব্যবহার করা হয়েছে।
সঠিক উদাহরণ
import java.util.List;
import com.google.gson.Gson;
public class GsonListTest {
public static void main(String args[]) throws Exception {
String jsonString = "{\"employees\":[{\"name\":\"Raja Ramesh\", \"technology\":\"Java\"}]}";
Gson gson = new Gson();
Software software = gson.fromJson(jsonString, Software.class);
System.out.println(software);
}
}
class Software {
List<Employee> employees; // List ব্যবহার
@Override
public String toString() {
return "Software [employees=" + employees + "]";
}
}
class Employee {
String name;
String technology;
@Override
public String toString() {
return "Employee [name=" + name + ", technology=" + technology + "]";
}
}
আউটপুট
Software [employees=[Employee [name=Raja Ramesh, technology=Java]]]
আরও সমাধান
- JsonArray টাইপ ব্যবহার:
JsonArray employees;(রخراج JSON ম্যানিপুলেশনের জন্য) - TypeToken ব্যবহার: জেনেরিক টাইপের জন্য
Type listType = new TypeToken<List<Employee>>(){}.getType(); gson.fromJson(json, listType); - @SerializedName: JSON কী এবং ফিল্ড নাম মিল না হলে অ্যানোটেশন ব্যবহার করুন