【问题标题】:RxJava,Retrofit Error :Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $RxJava,改造错误:预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT
【发布时间】:2018-01-16 23:04:39
【问题描述】:

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

我的代码如下。

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: 预期的 BEGIN_ARRAY 但是是 日志中第 1 行第 2 列路径 $ 处的 BEGIN_OBJECT

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

【问题讨论】:

  • 它只是你的响应是一个对象,但你试图获取数组你可以发布你的 json 响应
  • 它需要一个数组,你给它一个对象。您的模型类的主要问题。你没有正确解析它。你能把你的回复贴在这里吗,服务器的回复是什么?
  • 感谢您的帮助
  • @shahid17june 我收到来自服务器的空白响应,并且 onError() 被调用。
  • 我的模型类很简单,带有 tham 的 String id、name 和 getter 和 setter 方法

标签: android json rx-java retrofit2 gson


【解决方案1】:

再添加一个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);
      }
    });
  }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多