Retrofit使用FastJson

介紹

Retrofit 默認(rèn)提供了gson和Jackson對(duì)應(yīng)的converter,但是并沒有提供fastjson轉(zhuǎn)換。在參考了源碼的基礎(chǔ)之上對(duì)fastjson的使用進(jìn)行簡(jiǎn)單介紹厦章。

源碼分析

在此穆壕,我選擇了gson轉(zhuǎn)換的三個(gè)類GsonConverterFactory,GsonRequestBodyConverter,GsonResponseBodyConverter苹祟。

  • 首先GsonConverterFactory類:
    該類主要是將GsonRequestBodyConverter,GsonResponseBodyConverter整合到一起趟庄,后面使用的時(shí)候直接調(diào)用該類即可泪喊。
public final class GsonConverterFactory extends Converter.Factory {
 public static GsonConverterFactory create() {
   return create(new Gson());
 }

 @SuppressWarnings("ConstantConditions")
 public static GsonConverterFactory create(Gson gson) {
   if (gson == null) throw new NullPointerException("gson == null");
   return new GsonConverterFactory(gson);
 }
 private final Gson gson;
 private GsonConverterFactory(Gson gson) {
   this.gson = gson;
 }
 @Override
 public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
     Retrofit retrofit) {
   TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
   return new GsonResponseBodyConverter<>(gson, adapter);
 }
 @Override
 public Converter<?, RequestBody> requestBodyConverter(Type type,
     Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
   TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
   return new GsonRequestBodyConverter<>(gson, adapter);
 }
}
  • 參考得到FastJsonConverterFactory:這里也是整合作用窿克,不同于gson,fastjson需要以序列化的方式轉(zhuǎn)換骏庸。gson也可以使用序列化毛甲,這里使用TypeAdapter適配器可以提高效率。
 public class FastJsonConverterFactory extends Converter.Factory {

    private ParserConfig mParserConfig = ParserConfig.getGlobalInstance();
    private int featureValues = JSON.DEFAULT_PARSER_FEATURE;
    private Feature[] features;

    private SerializeConfig serializeConfig;
    private SerializerFeature[] serializerFeatures = {SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.SkipTransientField,
            SerializerFeature.DisableCircularReferenceDetect};

    public static FastJsonConverterFactory create() {
        return new FastJsonConverterFactory();
    }

    private FastJsonConverterFactory() {
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        return new FastJsonResponseBodyConverter<>(type, mParserConfig, featureValues, features);
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type,
                                                          Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return new FastJsonRequestBodyConverter<>(serializeConfig, serializerFeatures);
    }

    //get,set方法
    ...
}

+FastJsonRequestBodyConverter類具被,對(duì)請(qǐng)求轉(zhuǎn)化:

final class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    private SerializeConfig serializeConfig;
    private SerializerFeature[] serializerFeatures;

    FastJsonRequestBodyConverter(SerializeConfig config, SerializerFeature... features) {
        serializeConfig = config;
        serializerFeatures = features;
    }

    @Override
    public RequestBody convert(T value) throws IOException {
        byte[] content;
        if (serializeConfig != null) {
            if (serializerFeatures != null) {
                content = JSON.toJSONBytes(value, serializeConfig, serializerFeatures);
            } else {
                content = JSON.toJSONBytes(value, serializeConfig);
            }
        } else {
            if (serializerFeatures != null) {
                content = JSON.toJSONBytes(value, serializerFeatures);
            } else {
                content = JSON.toJSONBytes(value);
            }
        }
        return RequestBody.create(MEDIA_TYPE, content);
    }
}

+FastJsonResponseBodyConverter類玻募,對(duì)響應(yīng)轉(zhuǎn)化:

final class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {

    private static final Feature[] EMPTY_SERIALIZER_FEATURES = new Feature[0];

    private Type mType;

    private ParserConfig config;
    private int featureValues;
    private Feature[] features;

    FastJsonResponseBodyConverter(Type type, ParserConfig config, int featureValues,
                                  Feature... features) {
        mType = type;
        this.config = config;
        this.featureValues = featureValues;
        this.features = features;
    }

    @Override
    @SuppressWarnings("unchecked")
    public T convert(ResponseBody value) throws IOException {
        try {
            if (mType == String.class) {
                return (T) value.string();
            }
            return JSON.parseObject(value.string(), mType, config, featureValues,
                    features != null ? features : EMPTY_SERIALIZER_FEATURES);

        } finally {
            value.close();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市一姿,隨后出現(xiàn)的幾起案子七咧,更是在濱河造成了極大的恐慌,老刑警劉巖叮叹,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾栋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛉顽,警方通過查閱死者的電腦和手機(jī)裹粤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂林,“玉大人遥诉,你說我怎么就攤上這事≡胄穑” “怎么了矮锈?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睁蕾。 經(jīng)常有香客問我苞笨,道長(zhǎng),這世上最難降的妖魔是什么子眶? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任瀑凝,我火速辦了婚禮,結(jié)果婚禮上臭杰,老公的妹妹穿的比我還像新娘粤咪。我一直安慰自己,他們只是感情好渴杆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布寥枝。 她就那樣靜靜地躺著,像睡著了一般磁奖。 火紅的嫁衣襯著肌膚如雪囊拜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天比搭,我揣著相機(jī)與錄音冠跷,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜜托,可吹牛的內(nèi)容都是我干的弟疆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼盗冷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了同廉?” 一聲冷哼從身側(cè)響起仪糖,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迫肖,沒想到半個(gè)月后锅劝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟆湖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年故爵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隅津。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诬垂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伦仍,到底是詐尸還是另有隱情结窘,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布充蓝,位于F島的核電站隧枫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谓苟。R本人自食惡果不足惜官脓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涝焙。 院中可真熱鬧卑笨,春花似錦、人聲如沸仑撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派草。三九已至搀缠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間近迁,已是汗流浹背艺普。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歧譬。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓岸浑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瑰步。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矢洲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)缩焦,斷路器读虏,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 本文將順著構(gòu)建請(qǐng)求對(duì)象->構(gòu)建請(qǐng)求接口->發(fā)起同步/異步請(qǐng)求的流程,分析Retrofit是如何實(shí)現(xiàn)的袁滥。 開始之前盖桥,...
    zhuhf閱讀 1,610評(píng)論 0 10
  • 什么是Retrofit2 Retrofit是一個(gè)給Android和Java用的類型安全的HTTP客戶端,它將網(wǎng)絡(luò)請(qǐng)...
    不羈的木木閱讀 1,163評(píng)論 0 49
  • 一题翻、什么是Retrofit A type-safe HTTP client for Android and Jav...
    andcoder閱讀 757評(píng)論 2 3
  • 新的一年嵌赠,聽到的一句最深情的告白:在我最痛苦塑荒,迷茫,失落姜挺,低谷的時(shí)候袜炕,陪我從一個(gè)驕傲的男孩,變成一個(gè)知進(jìn)退懂擔(dān)當(dāng)?shù)?..
    笑音無恙閱讀 4,483評(píng)論 0 2