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

Retrofit2解析JSON报错:预期BEGIN_ARRAY却得BEGIN_OBJECT的解决问询

解决Retrofit2解析JSON时的"Expected BEGIN_ARRAY but was BEGIN_OBJECT"错误

这个错误其实很好排查,咱们直接看核心问题:

你当前的Retrofit接口定义Call<List<Result>> getData(),是在告诉Gson「我要解析一个Result类型的数组」,但接口实际返回的JSON外层是一个对象(开头是{),里面才包含名为results的数组。Gson找数组找不着,自然就报错了。

解决步骤非常清晰:

1. 创建对应外层JSON结构的实体类

你需要先定义一个类来匹配整个返回的JSON对象,比如命名为UserResponse:

import com.google.gson.annotations.SerializedName;
import java.util.List;

public class UserResponse {
    // 用@SerializedName注解绑定JSON里的键名,避免字段名和键名不一致的问题
    @SerializedName("results")
    private List<Result> results;

    // 生成getter方法(如果需要setter也可以加上)
    public List<Result> getResults() {
        return results;
    }
}

2. 修改Retrofit接口的返回类型

把原来的Call<List<Result>>改成Call<UserResponse>,让Retrofit知道要解析的是一个对象:

public interface UsersApi { 
    @GET("/api/?results=20") 
    Call<UserResponse> getData(); 
}

3. 在接口回调中获取目标数组

调用接口的时候,从返回的UserResponse对象里取出results数组即可:

usersApi.getData().enqueue(new Callback<UserResponse>() {
    @Override
    public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {
        if (response.isSuccessful() && response.body() != null) {
            // 这里就能拿到你需要的Result列表了
            List<Result> resultList = response.body().getResults();
            // 接下来处理你的业务逻辑
        }
    }

    @Override
    public void onFailure(Call<UserResponse> call, Throwable t) {
        // 处理请求失败的情况
        t.printStackTrace();
    }
});

简单总结一下:你之前跳过了外层的JSON对象,直接去解析里面的数组,导致Gson解析逻辑和实际数据结构不匹配。只要补上外层的实体类,让接口返回类型和实际JSON结构对应,这个问题就解决了。

内容的提问来源于stack exchange,提问作者Stepan Bezhuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:32:53