কম্পিউটার টিউটোরিয়াল

Gson-এ Expected BEGIN_OBJECT but was BEGIN_ARRAY সমস্যা সমাধান

ডিসিরিয়ালাইজেশনের সময় 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 কী এবং ফিল্ড নাম মিল না হলে অ্যানোটেশন ব্যবহার করুন
  1. জাভাতে Gson লাইব্রেরি ব্যবহার করে JSON স্ট্রিং ফাইলে লেখার পদ্ধতি

  2. জাভাতে GSON ব্যবহার করে JSON অবজেক্টের সব কি পাওয়ার পদ্ধতি

  3. জাভাতে Gson লাইব্রেরি ব্যবহার করে JSON প্রিটি প্রিন্ট করা

  4. জাভাতে NullPointerException কীভাবে সমাধান করবেন?