You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:18:17