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
相关产品推荐
相关产品推荐

