关于Retrofit使用Json数据的一个坑
一般在根据Json数据设计JavaBean的时候我们Android一般使用的GsonFormat这个插件工具,这个工具很方便,但是也有要注意的地方。今天在调试一个天气接口的时候因为没有复制该复制的内容,导致数据一直无法解析。接下来就贴出具体内容。
这是Json数据格式
应该全部复制到GsonFormat,不能把最外层的大括号漏掉。
正确的JavaBean内容
package com.example.rxandroidtest.entity;
import java.util.List;
/**
* Created by D'Russel on 2017/7/26.
*/
public class Weather {
private List<HeWeather5Bean> HeWeather5;
public List<HeWeather5Bean> getHeWeather5() {
return HeWeather5;
}
public void setHeWeather5(List<HeWeather5Bean> HeWeather5) {
this.HeWeather5 = HeWeather5;
}
............. //其他内容就不贴了,篇幅有限
}
错误的JavaBean内容
package com.example.rxandroidtest.entity;
/**
* Created by D'Russel on 2017/7/26.
*/
public class HeWeather5 {
private BasicBean basic;
private NowBean now;
private String status;
public BasicBean getBasic() {
return basic;
}
public void setBasic(BasicBean basic) {
this.basic = basic;
}
public NowBean getNow() {
return now;
}
public void setNow(NowBean now) {
this.now = now;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
............. //其他内容就不贴了,篇幅有限
}
上面两个对比一下,我们会发现,第二个的JavaBean实际上就是第一个JavaBean的内容,从第一个JavaBean中的
private List<HeWeather5Bean> HeWeather5;
可以看出来,这个可能会有多个HeWeather5值,所以第二种方式导致数据无法解析。
接下来来实现一下RxJava + Retrofit的结合使用
RxJava + Retrofit
- build.gradle的内容
添加依赖
compile "io.reactivex.rxjava2:rxjava:2.1.1"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
- 具体实现
和 Retrofit 的实现步骤差不多,咱们使用的接口是和风天气的接口
咱们先自定义一个网络服务,代码如下:
public interface NetWorkService {
//实况天气,传两个参数,一个是城市名,一个是从和风天气申请的key
@GET("now")
Observable<Weather> getCity(@Query("city") String city,
@Query("key") String key);
}
初始化网络请求
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://free-api.heweather.com/v5/") //这是和风天气的URL
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
获取访问的上海的城市id
NetWorkService netWorkService = retrofit.create(NetWorkService.class);
Observable<Weather> observable = netWorkService.getCity("上海",key);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Weather>() {
@Override
public void accept(@NonNull Weather weather) throws Exception {
System.out.println(weather);
System.out.println(weather.getHeWeather5().get(0).getBasic().getId());
}
});
结果如下:
这里的“”CN101020100“”就是和风天气对于的上海市的id
这样一个采用RxJava的Retrofit网络请求就实现了。
通过这个例子可以看出这种方式是非常的方便的。