繁体   English   中英

使用翻新和rxjava获取JSON数据

[英]Fetch JSON data using retrofit and rxjava

我想使用改造和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

我不知道这出了什么问题。 请帮忙。

您的类型

Observable<List<Data>> register();

是错的。 因为Json的第一级不是Array(但是具有字段data对象是array)。 您应该为外部结构创建类

public class Outer{
    List<Data> data;
}

并指定可观察到的改造:

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

您的api响应是一个JSONObject ,其中包含带有密钥dataJSONArray

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

public class ResponseData {

  @SerializedName("data")
  private List<Data> dataList;

  public List<Data> getDataList() {
    return dataList;
  }

  public void setDataList(List<Data> list) {
    dataList = list;
  }

}

RequestInterface使用ResponseData

public interface RequestInterface {

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

}

添加:

由于转换后的Response是ResponseData对象,因此handleResponse方法参数将是ResponseData类型。 handleResponse中,从getter方法获取所需列表,并将其设置为Adapter

handleResponse方法

private void handleResponse(ResponseData responseData) {
  if( responseData != null){
     List<Data> dataList = responseData.getDataList();
     mAndroidArrayList = new ArrayList<>();
     if(dataList!= null){
        mAndroidArrayList.addAll(dataList);
     }
     mAdapter = new DataAdapter(mAndroidArrayList);
     mRecyclerView.setAdapter(mAdapter);
 }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM