一般的我们会使用GsonConverterFactory,但是总会有一些奇葩要求困扰着我们。
1、首先得我们需要创建一个转换工厂类继承自系统的Converter.Factory;
2、根据响应实体类型,来对responseBody进行不同的转换;
3、创建xxConverter< T >继承自Converter< ResponseBody, T >,在重写的converter< T >方法中完成我们的转换。
public class MyConverterFactory extends Converter.Factory {
private static final String TAG = "debug";
private final Gson gson;
public static MyConverterFactory create() {
return create(new Gson());
}
public static MyConverterFactory create(Gson gson) {
return new MyConverterFactory(gson);
}
private MyConverterFactory(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
this.gson = gson;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
//判断响应实体类型是否是我们需要特殊处理的特殊类型(此处以String类型)
if (type == String.class) {
//创建xxConverter来 进行特殊转换
return new MyResponseConverter<String>(gson);
} else {
//其它类型我们不处理,返回null就行 会交给后面的解析器来解析
return null;
}
}
private class MyResponseConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
MyResponseConverter(Gson gson) {
this.gson = gson;
}
@Override
public T convert(ResponseBody value) throws IOException {
//在此处进行我们的转换
String response = value.string();
MovieDataBean movieDataBean = gson.fromJson(response, MovieDataBean.class);
// return (T) response;
return (T) App.getInstance().getResources().getString(R.string.test_string);
}
}
}
自定义好转换器工厂类之后我们就可以使用它了
retrofit = new Retrofit.Builder()
.client(client.build())
//添加我们的自定义转换器
.addConverterFactory(MyConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
- 需要注意的是添加转换器工厂的顺序,先添加的先被使用;
- 转换器工厂在源码里会被添加到集合中。