当前位置: 首页 > 知识库问答 >
问题:

改造预期BEGIN_ARRAY但BEGIN_OBJECT

漆雕和雅
2023-03-14

我正在通过改型和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;
}

我的类对象以及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不应该看到“类”:[]数组并从中解析对象吗?我做错了什么

共有1个答案

江洲
2023-03-14

正如@Commonware所提到的,使用这个JSON响应结构,您需要一些中间类来保存Clazz的集合(或者编写一个自定义的反序列化程序)。这样地:

public class ClassHolder {

    List<Clazz> classes;

}

getClass()的返回类型将更改为可观察

 类似资料:
  • 我每次都会收到这个错误:预期的begin_数组,但它是begin_对象。我不知道我是否需要添加反序列化程序或warrper类来进行改造,但我不知道如何以简单的方式来满足我所有项目的api json响应,下面是我的改造代码: - 我的Json: 我的源代码

  • 我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。 我使用的模型是: 我使用的改装界面: 当我输入正确的身份证号码时,一切正常。返回的结果是: 一切运作良好。 然而,当我输入不正确的身份证号码时,不好的事情发生了: 返回的结果是: 我怎样才能修复这些漏洞?

  • 我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject

  • 我的Retrofit2调用出现以下异常: 学分类别:

  • 问题内容: 我是JSON解析的新手,我使用Square的Retrofit库,遇到了这个问题。 我正在尝试解析此JSON响应: 这是我的模型: … 我的界面: 我的成功方法: 当我将其用于成功方法时,会引发错误 预期为BEGIN_OBJECT,但在第1行column2处为BEGIN_ARRAY 怎么了 问题答案: 现在,您正在解析响应,就好像它是这样格式化的: 异常告诉您,您期望在根目录有一个对象,

  • 问题内容: 我在列表中仅收到一个项目时收到此错误。我在服务器端REST Web服务中使用Jersey,当List返回一个元素并且当我得到它时,我仅收到错误,但是当它包含多个元素时,它可以正常工作,这就是我的工作方式它: 为什么Jersey不发送包含一个项目的列表?这是球衣的虫子吗?有没有办法使它始终序列化为数组? 当Web服务返回0元素时,这是我的JSON数据: 当Web服务返回1元素时,这是我的