在项目中,我使用了下面这个第三方库来进行网络请求,它是对RxJava+Retrofit的封装。
compile 'com.github.lygttpod:RxHttpUtils:2.3.3'
项目中有对Data的解析,但是这个库自带的GsonAdapter不支持对Data的解析,所以我百度后找到了解决方法,增加解析方式。 在这个库中,可以通过以下方式来设置GsonAdapter。
RxHttpUtils
.getInstance()
.init(this)
.config()
//使用自定义factory的用法
//.setCallAdapterFactory(RxJava2CallAdapterFactory.create())
//.setConverterFactory(ScalarsConverterFactory.create(),GsonConverterFactory.create(GsonAdapter.buildGson()))
//配置全局baseUrl
.setBaseUrl("https://api.douban.com/")
//开启全局配置
.setOkClient(okHttpClient);
这个GsonAdapter是库自带的:
public class GsonAdapter {
public static Gson buildGson() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
.registerTypeAdapter(int.class, new IntegerDefault0Adapter())
.registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(Long.class, new LongDefault0Adapter())
.registerTypeAdapter(long.class, new LongDefault0Adapter())
.create();
return gson;
}
}
改变后:
public class GsonAdapter {
public static Gson buildGson() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
.registerTypeAdapter(int.class, new IntegerDefault0Adapter())
.registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(double.class, new DoubleDefault0Adapter())
.registerTypeAdapter(Long.class, new LongDefault0Adapter())
.registerTypeAdapter(long.class, new LongDefault0Adapter())
.registerTypeAdapter(Date.class,new DateDeserializer())
.create();
return gson;
}
}
基于第三方的新增了一句.registerTypeAdapter(Date.class,new DateDeserializer())
再创建一个文件:
public class DateDeserializer implements JsonDeserializer<Date> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json != null) {
final String jsonString = json.getAsString();
try {
return dateFormat.parse(jsonString);
} catch (ParseException e) {
e.printStackTrace();
}
final long jsonLong= json.getAsLong();
try {
return new Date(jsonLong);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
这样就可以完美解析带Data类型的数据了。
感谢帮助:Retrofit里面Gson解析日期出错