JavaRetrofit2使用–自定義轉換器
Retrofit2的基礎使用請參考Java Retrofit2使用
自定義Converter(轉換器)
retrofit預設情況下支援的converts有Gson,Jackson,Moshi…
- 搭建基礎架構
這裡將自定義一個FastJsonConverterFactory來解析返回的資料,其內部使用阿里巴巴的Fastjson(依賴新增compile `com.alibaba:fastjson:1.2.37`
)。
首先要搭建好Retrofit2的使用架構,其次在建立Retrofit例項的時候新增一個
// 3. 獲取例項
Retrofit retrofit = new Retrofit.Builder()
// 設定OKHttpClient,如果不設定會提供一個預設的
.client(new OkHttpClient())
//設定baseUrl
.baseUrl(url)
//新增Gson轉換器
.addConverterFactory(FastJsonConverterFactory.create())
.build();
- 建立繼承與Converter.Factory的FastJsonConverterFactory類,並實現create(),requestBodyConverter(),responseBodyConverter()方法。
/**
* fastjson解析工廠
* @author mazaiting
*/
public class FastJsonConverterFactory extends Converter.Factory{
public static Factory create() {
return new FastJsonConverterFactory();
}
@Override
public Converter<Info, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
Annotation[] methodAnnotations, Retrofit retrofit) {
return new FastJsonRequestConverter();
}
@Override
public Converter<ResponseBody, Info> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
return new FastJsonResponseConverter(type);
}
}
- 實現FastJsonRequestConverter類
/**
* 請求轉換類,將Info物件轉化為RequestBody物件
* @author mazaiting
*/
public class FastJsonRequestConverter implements Converter<Info, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
private static final Charset UTF_8 = Charset.forName("UTF-8");
public FastJsonRequestConverter() {
}
public RequestBody convert(Info value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
writer.write(value.toString());
writer.close();
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
}
- 實現FastJsonResponseConverter類
/**
* fastjson響應轉換器,將ResponseBody物件轉化為Info物件
* @author Administrator
*
*/
public class FastJsonResponseConverter implements Converter<ResponseBody, Info> {
/**
* 反射型別
*/
private Type type;
public FastJsonResponseConverter(Type type) {
this.type = type;
}
public Info convert(ResponseBody value) throws IOException {
try {
/**
* fastjson解析資料
* 此處特別注意: Info應為外部類,並將其類中的成員設定為public,
* 否則會無法建立Info物件,從而導致解析異常
*/
Info info = JSON.parseObject(value.string(), type);
System.out.println(info);
return info;
} finally {
value.close();
}
}
}
相關文章
- 自定義值轉換器
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- Django(6)自定義路由轉換器Django路由
- Native Query的自定義轉換器
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- Spring Boot之自定義JSON轉換器Spring BootJSON
- springmvc 自定義訊息轉換器完整例子SpringMVC
- 【Flask】路由裝飾器、路徑傳參、自定義路由轉換器Flask路由
- C# 自定義 implicit和explicit轉換C#
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- 09.AutoMapper 之自定義型別轉換器(Custom TypeAPP型別
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- C#自定義控制元件—轉換開關C#控制元件
- gin自定義驗證器&轉化中文
- shiro使用自定義session管理器Session
- FlinkSQL使用自定義UDTF函式行轉列-IK分詞器SQL函式分詞
- iOS使用自定義URL實現控制器之間的跳轉iOS
- Loadrunner 使用者自定義函式使用[轉]函式
- 自定義Navigator切換fragmentFragment
- QT自定義精美換膚介面QT
- WPF快速指導4:資料繫結之繫結方向與自定義轉換器
- 08.Django自定義模板,自定義標籤和自定義過濾器Django過濾器
- 4、過濾器的使用及自定義過濾器過濾器
- Angular過濾器 自定義及使用方法Angular過濾器
- 在UNIX系統中使用自定義功能鍵(轉)
- 使用AVPlayer自定義支援全屏的播放器(四)播放器
- Spring 定時器的使用—Xml、Annotation、自定義Spring定時器XML
- qt設計器中使用自定義控制元件QT控制元件
- 使用client-go實現自定義控制器clientGo
- 使用AVPlayer自定義支援全屏的播放器(一)播放器
- Spring 定時器的使用---Xml、Annotation、自定義Spring定時器XML
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- 使用Photos自定義相簿
- TransitionAnimation自定義轉場動畫NaN動畫
- 自定義轉場動畫(二)動畫
- 自定義轉場動畫(一)動畫
- 【轉】 java自定義註解Java
- ORACLE 自定義型別[轉]Oracle型別