使用翻新和rxjava获取JSON数据

时间:2018-07-20 17:37:52

标签: android json rx-java retrofit

我想使用翻新和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

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

3 个答案:

答案 0 :(得分:2)

您的类型

Observable<List<Data>> register();

是错误的。因为Json的第一级不是数组(而是具有字段data的对象,所以是数组)。 您应该为外部结构创建类

public class Outer{
    List<Data> data;
}

并以可观察的方式指定改型:

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

答案 1 :(得分:2)

您的api响应是一个JSONObject,其中包含一个密钥为JSONArray的{​​{1}}。

用另一个Model类包装数据列表

data

public class ResponseData { @SerializedName("data") private List<Data> dataList; public List<Data> getDataList() { return dataList; } public void setDataList(List<Data> list) { dataList = list; } } 中使用ResponseData

RequestInterface

已添加

由于转换后的Response是public interface RequestInterface { @GET("/bins/mxcsl/") Observable<ResponseData> register(); } 对象,因此您的ResponseData方法参数将是handleResponse类型。在ResponseData中,从getter方法获取所需列表并将其设置为handleResponse

Adapter方法

handleResponse

答案 2 :(得分:0)

错误是因为Retrofit期望将json数组反序列化为列表

public interface RequestInterface {

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

但是json响应是一个对象,该对象具有名为 data 的字段,该字段是一个数组

{
 "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"
}]}