如何在Java中使用Gson解决“预期是BEGIN_OBJECT但是BEGIN_ARRAY”?
反序列化时,Gson可以期望使用JSON对象,但可以找到JSON数组。由于无法从一个转换为另一个,因此在运行时可能会引发错误,例如“JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但为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; } 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(ReflectiveTypeAdapterFactory.java:176)at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)at com.google.gson.Gson.fromJson(Gson.java:795) at com.google.gson.Gson.fromJson(Gson.java:761) at com.google.gson.Gson.fromJson(Gson.java:710) at com.google.gson.Gson.fromJson(Gson.java:682) at BeginObjectError.main(BeginObjectError.java:7) 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) at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
我们需要通过将 POJO类型更改为 Collection或Array类型来解决该问题。 在下面的示例中,我们可以在POJO类中使用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; @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]]]