我想使用翻新和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
我不知道哪里出了问题。请帮忙。
答案 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"
}]}