首页 > 解决方案 > 使用改造和 rxjava 获取 JSON 数据

问题描述

我想使用改造和 rxjava从 URL https://api.myjson.com/bins/mxcsl/获取 json。示例 json 是这样的:

{
"data": [
{
  "itemId": "1",
  "desc": "Batcave",
  "audio": "https://storage.googleapis.com/a/17.mp3"
},
{
  "itemId": "2",
  "desc": "Fight Club rules",
  "audio": "https://storage.googleapis.com/a/2514.mp3"
},
{
  "itemId": "3",
  "desc": "Make an offer",
  "audio": "https://storage.googleapis.com/a/47.mp3"
}]}

这是我的代码:数据模型:

public class Data {

private String itemId;
private String desc;
private String audio;

public String getItem() {
    return itemId;
}

public String getDesc() {
    return desc;
}

public String getAudio() {
    return audio;
}}

这是接口:

public interface RequestInterface {

@GET("/bins/mxcsl/")
Observable<List<Data>> register();

}

我正在加载这样的东西:

private void loadJSON() {


    RequestInterface requestInterface = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build().create(RequestInterface.class);

    mCompositeDisposable.add(requestInterface.register()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(this::handleResponse,this::handleError));
}

private void handleResponse(List<Data> androidList) {

    mAndroidArrayList = new ArrayList<>(androidList);
    mAdapter = new DataAdapter(mAndroidArrayList);
    mRecyclerView.setAdapter(mAdapter);
}

private void handleError(Throwable error) {

    Toast.makeText(this, "Error "+error.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}

但是我也收到了预期的错误 BEGIN_ARRAY 但是是 BEGIN_OBJECT

我不知道这是哪里出了问题。请帮忙。

标签: androidjsonrx-javaretrofit

解决方案


你的类型

Observable<List<Data>> register();

是错的。因为 Json 的第一层不是 Array(而是带有 field 的对象data,即数组)。您应该为外部结构创建类

public class Outer{
    List<Data> data;
}

并在改造中指定,如可观察到的:

@GET("/bins/mxcsl/")
Observable<Outer> register();

推荐阅读