如何使用Gson解析JSON?遇JsonSyntaxException异常求助
解决Gson解析时的
Expected BEGIN_OBJECT but was BEGIN_ARRAY错误 嘿,这个报错我太常见了!咱们先把问题拆解清楚:
你看到的com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY,本质是你让Gson去解析一个JSON对象(用{}包裹的结构),但实际传入的是一个JSON数组(用[]包裹的结构),两者结构不匹配所以抛出了错误。
下面给你两种最常见的解决方案,对应不同的JSON结构:
情况1:你的JSON本身就是一个数组
比如你的JSON长这样:
[{"name":"张三","age":28},{"name":"李四","age":30}]
这时候你不能直接把它解析成单个Java对象,而是要解析成数组或者集合:
方式1:解析成对象数组
假设你的Java实体类是User:
public class User { private String name; private int age; // 生成getter、setter、构造方法 }
解析代码:
String json = "[{\"name\":\"张三\",\"age\":28},{\"name\":\"李四\",\"age\":30}]"; Gson gson = new Gson(); // 直接解析成User数组 User[] userArray = gson.fromJson(json, User[].class);
方式2:解析成List集合
如果更习惯用List操作,可以借助TypeToken来指定泛型类型:
List<User> userList = gson.fromJson(json, new TypeToken<List<User>>(){}.getType());
情况2:你的JSON是外层对象包裹数组
比如你的JSON长这样:
{ "code": 200, "message": "成功", "data": [{"name":"张三","age":28},{"name":"李四","age":30}] }
这时候你需要先创建一个对应外层结构的Java类,比如UserResponse:
public class UserResponse { private int code; private String message; private List<User> data; // 生成getter、setter、构造方法 }
然后直接解析成这个外层类即可:
UserResponse response = gson.fromJson(json, UserResponse.class); // 之后可以通过response.getData()拿到数组对应的集合
最后提醒你:一定要确保Java类的字段名和JSON的键名一致(或者用@SerializedName注解映射不同的名字),不然Gson也会解析失败哦!
内容的提问来源于stack exchange,提问作者Danil
相关产品推荐
相关产品推荐

