Json解析其實(shí)本身是一件很簡單的事情,但是本次在工作中剛好遇到了一些相關(guān)問題,所以找個(gè)時(shí)間記錄一下。
首先數(shù)據(jù)是放入Map集合然后使用Volley傳輸,本地緩存的時(shí)候使用了ORM數(shù)據(jù)庫,因此不可避免的遇到需要將實(shí)體對(duì)象轉(zhuǎn)為Map集合,或者M(jìn)ap集合轉(zhuǎn)為實(shí)體對(duì)象的問題。
因?yàn)轫?xiàng)目中本身使用了fastjson,所以這兩步轉(zhuǎn)換其實(shí)很簡單,fastjson自身并沒有提供直接的轉(zhuǎn)換方案,所以必須要中間過渡一下:
比如實(shí)體對(duì)象轉(zhuǎn)換為Map:

然后Map再轉(zhuǎn)換為實(shí)體對(duì)象:

本身沒有什么問題,但是真正引入項(xiàng)目中后,QA反饋項(xiàng)目會(huì)很卡,于是進(jìn)行了分析(雖然后面發(fā)現(xiàn)跟這個(gè)暫時(shí)關(guān)系不大)。
首先針對(duì)Bean轉(zhuǎn)換為map進(jìn)行了修改,之前fastJson是需要先將Bean轉(zhuǎn)換為String,再轉(zhuǎn)換為Map,現(xiàn)在改成直接使用反射,來獲取Bean對(duì)象中的每一個(gè)屬性,以及對(duì)應(yīng)的get和set方法。

效果確實(shí)不太一樣了。
但是其實(shí)本身項(xiàng)目中有十幾個(gè)Bean,然后每一個(gè)都有幾十個(gè)屬性,而且觸發(fā)上報(bào)的頻率其實(shí)相當(dāng)高,所以其實(shí)本身不太想用反射。
如果直接在每一個(gè)Bean對(duì)象中做序列化轉(zhuǎn)換呢?在每一個(gè)Bean中添加toMap(Object object)和toBean(Map map)的方法,再試一下效果呢?

效果很明顯,原生直接轉(zhuǎn)換的速度會(huì)比反射高一個(gè)數(shù)量級(jí),然后直接反射比fastJson高1-3倍。
但是呢,直接手動(dòng)去掉反射,代價(jià)太大了,每個(gè)Bean都有幾十個(gè)屬性,過于復(fù)雜。
參考美團(tuán)對(duì)MSON的講解,可以想起來完全將這一步工作自動(dòng)化起來,那就使用AnnotationProcessor好了,編譯前對(duì)Bean進(jìn)行處理,添加對(duì)應(yīng)的兩個(gè)方法,減少人工處理的操作。
那么首先去AnnotationProcessor去看了一下,本來想自己編譯出jar包,但是感覺很麻煩,那就直接去MVN倉庫下載好了,這里只需要去下載androidannotations-4.4.0.jar和androidannotations-api-4.4.0.jar,地址:Group: AndroidAnnotations

按照下面的方式把兩個(gè)jar包放進(jìn)去:

然后就是開始配置,但是其實(shí)發(fā)現(xiàn)eclipse中的Java Compiler里面并沒有Annotation Processing,此時(shí)就需要安裝插件了,但是這里走了一個(gè)彎路,我自己的eclipse在安裝插件時(shí)候總是出現(xiàn)問題,所以直接去了eclipse官網(wǎng)查看并按照流程安裝:
Installing the Java Development Tools

至于如何配置compile-lib就比較簡單了,我是參照這篇文章操作的,比較簡單: