Android中如何将多对象JSON解析为同类型对象List?
解决Gson解析时"Expected BEGIN_ARRAY but was BEGIN_OBJECT"的问题
这个错误我之前也踩过坑,本质就是Gson预期要解析一个JSON数组([]包裹的结构),但你传入的JSON却是一个JSON对象({}包裹的结构),所以才会触发报错。结合你要解析成同类型对象List的需求,分两种常见场景给你解决方案:
情况1:JSON外层是对象,内部包含目标数组
很多后端接口会把数组包裹在一个外层对象里(比如附带状态码、分页信息的场景),举个示例JSON:
{ "code": 200, "msg": "请求成功", "data": [ {"id": 1, "username": "Alice"}, {"id": 2, "username": "Bob"} ] }
这种情况下,你需要先创建一个外层包装类来匹配这个JSON结构:
// 假设你的实体类是User public class ApiResult { private int code; private String msg; private List<User> data; // 这里的List就是你最终要的集合 // 记得生成getter/setter,或者用Lombok的@Data注解简化代码 public List<User> getData() { return data; } public void setData(List<User> data) { this.data = data; } // 其他字段的getter/setter... }
然后用Gson解析这个包装类,再取出内部的List即可:
Gson gson = new Gson(); String jsonContent = "你的JSON字符串"; ApiResult result = gson.fromJson(jsonContent, ApiResult.class); List<User> userList = result.getData();
情况2:后端返回的是单个对象(而非数组)
如果后端本该返回数组,但实际只返回了单个对象(比如数据只有一条时偷懒返回了对象),你可以先判断JSON的开头字符,手动把单个对象包装成数组再解析:
Gson gson = new Gson(); String jsonContent = "你的JSON字符串"; List<User> userList; // 检查JSON是否为单个对象格式 if (jsonContent.trim().startsWith("{")) { // 先解析成单个实体对象 User singleUser = gson.fromJson(jsonContent, User.class); // 包装成List(如果需要可修改的List,就用new ArrayList<>(Collections.singletonList(singleUser))) userList = Collections.singletonList(singleUser); } else { // 正常解析数组,这里要注意用TypeToken解决Java泛型擦除问题 userList = gson.fromJson(jsonContent, new TypeToken<List<User>>() {}.getType()); }
关键提醒:解析泛型List的正确姿势
直接用List<User>.class是行不通的,因为Java的泛型会被擦除,Gson无法识别具体的泛型类型。必须用TypeToken来指定完整的泛型类型,也就是上面代码里的new TypeToken<List<User>>() {}.getType(),这是Gson解析泛型集合的标准写法。
内容的提问来源于stack exchange,提问作者somik07
相关产品推荐
相关产品推荐

