反序列化时,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;
}
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 类型更改为 集合或数组来解决此问题类型。 在下面的示例中,我们可以在 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 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]]]
登录后复制
以上就是如何使用Gson在Java中解决“Expected BEGIN_OBJECT but was BEGIN_ARRAY”错误?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!