JavaRetrofit2使用–自定義轉換器

凌浩雨發表於2017-08-23

Retrofit2的基礎使用請參考Java Retrofit2使用

自定義Converter(轉換器)
retrofit預設情況下支援的converts有Gson,Jackson,Moshi…

  1. 搭建基礎架構
    這裡將自定義一個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();
  1. 建立繼承與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);
    }

}
  1. 實現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());
    }

}
  1. 實現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();
        }
    }

}


相關文章