最近在項(xiàng)目中使用到Retrofit來做網(wǎng)絡(luò)請(qǐng)求,Retrofit框架中有個(gè)非常好用的參數(shù)@body,該參數(shù)在做post請(qǐng)求的時(shí)候,能夠?qū)⒎庋b了請(qǐng)求參數(shù)的JavaBean對(duì)象 直接序列化然后發(fā)送到服務(wù)器躏筏,如圖一:
想一想,當(dāng)你需要使用post請(qǐng)求向服務(wù)器提交一大堆數(shù)據(jù)(如圖二)的時(shí)候,你內(nèi)心是不是崩潰的!
然而旺入,當(dāng)你配合Retrofit的@Body 你的接口請(qǐng)求可以寫成這樣(如圖三)!簡(jiǎn)直就是藝術(shù)凯力!有木有茵瘾!有木有!
可是咐鹤,這并不完美拗秘!如果你使用這種方式做Post請(qǐng)求,你可能會(huì)像我一樣祈惶,讓后端的童鞋感到莫名其妙雕旨,請(qǐng)求參數(shù)明明只有a,b,c;你傳過去的請(qǐng)求參數(shù)里面為什么除了a,b,c,還有一大丟亂七八糟的 e,f,g捧请? 原因很簡(jiǎn)單:因?yàn)槲覀兎庋b了參數(shù)的JavaBean 里面凡涩,往往會(huì)有一些我們不需要傳遞給服務(wù)器的參數(shù)數(shù)據(jù) ,但確是需要存在的數(shù)據(jù) ?比如圖三中用Order對(duì)象 在創(chuàng)建訂單的時(shí)候疹蛉,他的id對(duì)于此次請(qǐng)求是多余的參數(shù)活箕,但是在另外的一個(gè)獲取Order列表的請(qǐng)求中,這個(gè)id就能派上用場(chǎng)了可款;
所以問題來了(回歸正題^_^)讹蘑,我們能不能在向服務(wù)器提交請(qǐng)求的時(shí)候,將JavaBean在序列化的過程中剔除多余參數(shù)筑舅,然后又不影響請(qǐng)求的數(shù)據(jù)反序列化為JavaBean座慰,好像很拗口,具體來說就是翠拣,比如這個(gè)Order對(duì)象在提交給服務(wù)器的時(shí)候版仔,其序列化的過程中能不能過濾掉id參數(shù),然后又不影響在獲取Order列表的時(shí)候 ?Json數(shù)據(jù)反序列化為Order對(duì)象的時(shí)候?qū)d成員變量的賦值误墓。
當(dāng)然可以蛮粮!使用@Expose 注解便可以實(shí)現(xiàn)(如圖四):
@Expose 有兩個(gè)參數(shù) serialize 和 deserialize,即序列化與反序列化谜慌,當(dāng)不指定的時(shí)候 默認(rèn)都為true ; 而且該注解只在Gson通過
Gson gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();方式創(chuàng)建的時(shí)候有效然想,也就是在通過Gson gson=new Gson()方式創(chuàng)建的時(shí)候,@Expose注解是無效的欣范。也就是有沒有都一樣变泄,切記令哟!
圖四中 在Gson使用GsonBuilder創(chuàng)建下,Post請(qǐng)求中妨蛹,id,code以及a字段會(huì)在序列化過程中過濾掉屏富,也就是通過Retrofit向服務(wù)器提交Order對(duì)象的時(shí)候,服務(wù)器端只能接受到remark和list對(duì)應(yīng)的數(shù)據(jù) 蛙卤,除此之外的字段因?yàn)樵谛蛄谢倪^程中被忽略而沒有提交給服務(wù)器狠半。你可能注意到了list字段的@Expose注解 其deserialize=false, 這是因?yàn)槲襩ist字段在序列化的過程中是服務(wù)器需要的數(shù)據(jù),但是在反序列化的過程中不希望他被賦值 所以在此進(jìn)行了過濾颤难。
也許有童鞋會(huì)問神年。還有其它方式?jīng)]有,答案是有的行嗤,Gson 序列化/反序列化過程中過濾指定字段的方式大概有四種已日,此處只是說到了其中的一種而已 ,其它的三種:排除transient字段昂验;排除Modifier為指定類型的字段捂敌;使用ExclusionStrategy定制字段排除策略艾扮;
排除transient字段:給字段添加transient字段 然后在 序列化/反序列化過程中該字段都會(huì)被過濾 不能單獨(dú)對(duì)某一過程設(shè)置既琴;
排除Modifier為指定類型的字段:通過Gson gson =newGsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED) 方式獲取Gson并設(shè)置過濾域的修飾詞 ?此處為過濾protected修飾的字段 也是同時(shí)作用于序列化/反序列化 不能單獨(dú)對(duì)某一過程設(shè)置(待考證)
使用ExclusionStrategy定制字段排除策略:也是通過newGsonBuilder()來設(shè)置,自定義程度很高(等效于同時(shí)設(shè)置GsonBuilder的addSerializationExclusionStrategy和addDeserializationExclusionStrategy方法)泡嘴,詳情百度即可甫恩,在此就不作詳述了
OK,就講這么多吧;純手寫酌予,如果對(duì)大家有用磺箕,別忘了星星我哦,嘿嘿. ?
PS.不足之處抛虫,還望指正松靡,畢竟技術(shù)有限,期待大神們的指導(dǎo) 謝謝