接口定義中要寫明轉(zhuǎn)換類型 TYNetworkingRespondModel
public class TYNetworkingRespondModel {
private String Msg;
private int Code;
private Map Data;
}
@GET("app/MobileApp.ashx")
Call<TYNetworkingRespondModel> createGetRequest(@Query("Module") String module,@Query("Param") String param);
自定義Factory中處理轉(zhuǎn)換
public class MyConverterFactory extends Converter.Factory {
public static MyConverterFactory create() {
return create(new Gson());
}
private final Gson 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;
}
// @javax.annotation.Nullalbe
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
//判斷響應(yīng)實(shí)體類型是否是我們需要特殊處理的特殊類型(此處以String類型)
if (type == TYNetworkingRespondModel.class) {
//創(chuàng)建xxConverter來(lái) 進(jìn)行特殊轉(zhuǎn)換
return new MyResponseConverter<TYNetworkingRespondModel>(gson);
} else {
//其它類型我們不處理薄疚,返回null就行 會(huì)交給后面的解析器來(lái)解析
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 {
//在此處進(jìn)行我們的轉(zhuǎn)換
String response = value.string();
TYNetworkingRespondModel movieDataBean = gson.fromJson(response, TYNetworkingRespondModel.class);
// return (T) response;
return (T) movieDataBean;
}
}
}
具體使用
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TYStaticDefine.STR_BASE_URL)
.addConverterFactory(MyConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
更復(fù)雜的轉(zhuǎn)化可以通過(guò)自定義JsonDeserializer實(shí)現(xiàn)
詳情見:http://www.javacreed.com/gson-deserialiser-example/