改造预计 BEGIN_ARRAY 但 BEGIN_OBJECT

Retrofit expected BEGIN_ARRAY but was BEGIN_OBJECT

我正在通过改造和 RXAndroid 与来自 android 的 REST API 进行交互,但我 运行 遇到了问题。

当我向我的 'api/users/{id}/{id}/classes' 发送 GET 请求时,我的 api 以用户列表 类 响应,如下所示:

{
   "classes": [
    {
         "assignments": [
         {
             "asstype": 0, 
             "classs_id": 1, 
             "desc": "Read", 
             "due": "9/14/16", 
             "id": 1
         }
         ], 
   "badge": 0, 
   "days": "W", 
   "id": 1, 
   "location": "W.Claire Harris Textiles 136A", 
   "name": "STS 1101", 
   "professor": "Stickel", 
   "time": "5:00 - 6:15", 
   "user_id": 1
 }, 
 {
  "assignments": [], 
  "badge": 1, 
  "days": "TR", 
  "id": 2, 
  "location": "Atrium 201L", 
  "name": "HIST 2111", 
  "professor": "Pierce", 
  "time": "6:30 - 7:45", 
  "user_id": 1
  }
 ]
}

我的界面是这样的:

@GET("api/users/{user_id}/classes")
Ovservable<List<Clazz>> getClasses(@Header("Authorization") String auth, @Path("user_id")int user_id);

我从我的片段中这样调用它:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_classes, container, false);
    Retrofit retrofit = new Retrofit.Builder()
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .baseUrl(Sched.API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RecyclerView classesRV = (RecyclerView)rootView.findViewById(R.id.classRec);
    ClassInterface classAPI = retrofit.create(ClassInterface.class);
    Observable<List<Class>> classes = classAPI.getClasses("Basic " +Base64.encodeToString("joyod3@gmail.com:nightman_420".getBytes(), Base64.NO_WRAP), 1);

    classes.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<List<Class>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onNext(List<Class> classes) {
                    classesRV.setAdapter(new ClassRecyclerViewAdapter(classes, getContext()));
                    classesRV.setLayoutManager(new LinearLayoutManager(getContext()));
                }
            });
    return rootView;
}

我的 Class 对象与 getter 和 setter 看起来像这样:

public class Class {
private int id;
private String name;
private int badge;
private String professor;
private String location;
private String days;
private String time;
private int user_id;
private List<Assignment> assignments;

public Class() {
}

gson 不应该看到 "classes": [] 数组并从中解析对象吗?我做错了什么

正如@CommonsWare 所提到的,使用此 JSON 响应结构,您将需要一些中间 class 来保存 Clazz 的集合(或完全编写自定义反序列化程序)。像这样:

public class ClassHolder {

    List<Clazz> classes;

}

getClasses() 的 return 类型将相应地更改为 Observable<ClassHolder>