android - RxJava,改造错误:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

标签 android json rx-java retrofit2 gson

我正在使用 Retrofit 和 RxJava 库并尝试解析此 url:

我的代码如下。

APIInterface.java

public interface APIService {
    @GET("/bins/tdze5")
    Observable<List<Student>> getdata();
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

  private RecyclerView recyclerView;
  private List<Student> list;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);

    getData();
  }

  private void getData() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.myjson.com")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    APIService apiService = retrofit.create(APIService.class);

    Observable<List<Student>> observable = apiService.getdata().subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());

    observable.subscribe(new Observer<List<Student>>() {
      @Override
      public void onCompleted() {
      }

      @Override
      public void onError(Throwable e) {
        Log.d("error",e.toString());
      }

      @Override
      public void onNext(List<Student> students) {
        list = new ArrayList<>();
        Log.d("response size", String.valueOf(students.size()));
        for(int i = 0; i < students.size(); i++){
          Student student = new Student();
          student.setId(students.get(i).getId());
          student.setName(students.get(i).getName());
          list.add(student);
        }

        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(list);
        RecyclerView.LayoutManager recyce = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(recyce);
        recyclerView.setItemAnimator( new DefaultItemAnimator());
        recyclerView.setAdapter(recyclerAdapter);
      }
    });
  }
}

我的模型类如下

Student.java

public class Student {

private String id;

private String name;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
} }

我得到了

D/error: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ in Log

我到处搜索这个错误,但找不到任何关于 RxJava 和 Retrofit 的信息。

最佳答案

再添加一个 class 并像下面这样使用它。

public class ResponseClass {

    @SerializedName("students")
    @Expose
    private List<Student> students = null;

    public List<Student> getStudents() {
    return students;
    }

    public void setStudents(List<Student> students) {
    this.students = students;
    }

    }

APIInterface.java

public interface APIService {
    @GET("/bins/tdze5")
    Observable<ResponseClass> getdata();
}

MainActivity.java

private void getData() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.myjson.com")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    APIService apiService = retrofit.create(APIService.class);

    Observable<ResponseClass> observable = apiService.getdata().subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());

    observable.subscribe(new Observer<ResponseClass>() {
      @Override
      public void onCompleted() {
      }

      @Override
      public void onError(Throwable e) {
        Log.d("error",e.toString());
      }

      @Override
      public void onNext(ResponseClass response) {
        list = new ArrayList<>();
        List<Student> students = response.getStudents();
        Log.d("response size", String.valueOf(students.size()));
        for(int i = 0; i < students.size(); i++){
          Student student = new Student();
          student.setId(students.get(i).getId());
          student.setName(students.get(i).getName());
          list.add(student);
        }

        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(list);
        RecyclerView.LayoutManager recyce = new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(recyce);
        recyclerView.setItemAnimator( new DefaultItemAnimator());
        recyclerView.setAdapter(recyclerAdapter);
      }
    });
  }

关于android - RxJava,改造错误:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45584210/

相关文章:

java - 如何在 Flowable.generate 中使 Files.lines AutoCloseable

android - 当 EditText 有文本时启用按钮 (RxAndroid)

java - 方法完成后变量返回 null

json - 如何通过 jq 命令将 json 文件中的所有整数转换为字符串?

android - 带有 flatMapCompletable 的 RxJava 2 Observable 未完成

json - 使用 Jmeter 通过 post 请求上传/发送文件时出现问题

Java toString 将json(gson impl)放在日志中

android - 在 AsyncTask 中传递 ArrayList<HashMap<String, String>>

java - Android 应用程序中的自定义 PDF 查看器,需要免费或一次性许可的解决方案

android - 在全局流程中服务而不是被创造