android中結(jié)構(gòu)類似的json解析

初衷

項目中與服務(wù)器端的數(shù)據(jù)交互采用的是json豫领,服務(wù)器返回的數(shù)據(jù)格式比較統(tǒng)一等恐,都是下面這種樣子的

 {resultCode:10000,
   resultContent:"登錄成功",
   obj:{...} //或者[...]
 }

對于這段json的解析郊尝,我覺得有下面幾種方式:

  1. 通過android自帶的JSONObject以及JSONArray采用原生的方式一層一層的解析;
  • 通過android自帶的JSONObject解析到obj 然后配合Gson解析obj對應(yīng)的具體內(nèi)容;
  • 為每一種格式的json寫對應(yīng)的實體類(包括json的所有字斷)然后通過gson或者其他解析工具解析成對象扎即。

通過對比發(fā)現(xiàn),第一種方式對于obj結(jié)構(gòu)復(fù)雜的情況會出現(xiàn)代碼龐大的問題刁绒;第二種在解析每個json的時候會出現(xiàn)重復(fù)代碼知市;第三種需要為每個json寫實體類,會出現(xiàn)屬性重復(fù)的情況如果采用繼承的話會出現(xiàn)某些實體類中就一個屬性的情況莫杈。
本文的目標就是針對第三種方式的一種封裝筝闹,開發(fā)者可以只提供obj對應(yīng)的實體類即可关顷。當(dāng)然更希望本文提供的是解決一類問題的思路议双。

想法

如果有一個類 包含3個字段平痰,分別是:int resultCode,String resultContent,Object obj; 然后根據(jù)返回的json的需求昂芜,將obj替換成對應(yīng)的具體的類,可想而知需要用到泛型(obj應(yīng)該是T類型的即T obj)泌神。

實現(xiàn)

按照本文最開始的json結(jié)構(gòu)舉例,定義一個實體類如下:

   public class Results<T>{
    private int resultCode;//結(jié)果碼
    private String resultContent;//服務(wù)器端返回的結(jié)果碼說明欢际,可以用于toast顯示
    private T Object;//具體的數(shù)據(jù),可以是對象或者list
        //getter setter...
  }

下面到本文的主角出場了损趋,我一般喜歡用google的Gson作為json的解析工具,本文也已gson作為示例(PS:Gson是個非常強大的工具舶沿,強烈推薦使用)括荡。
定義一個公共方法供外部調(diào)用畸冲,也是解析的主要方法邑闲,代碼如下:

 public static Results fromJson(String json, Type clazz) {
        Gson gson = new Gson();
        Type objectType = type(Results.class, clazz);
        return gson.fromJson(json, objectType);
 }

下面是type方法的實現(xiàn):

static ParameterizedType type(final Class raw, final Type... args){
      return new ParameterizedType() {
          public Type getRawType() {
              return raw;
          }
          public Type[] getActualTypeArguments() {
              return args;
          }
           public Type getOwnerType() {
              return null;
          }
      };
  }

簡單解釋一下,type方法的作用就是把Results類里面的T類型的變量obj轉(zhuǎn)換成傳入的Type clazz 對應(yīng)的類型,里面的兩個參數(shù)第一個代表包含泛型類的類儡陨,本例中就是Results了;第二個參數(shù)代表的是泛型變量對應(yīng)的具體的類型,需要說明的是如果是list類型的需要通過Gson提供的方法得到正確的type值傳入嫌褪,如果是普通的Object類只需要傳入對應(yīng)類的class即可笼痛,比如User.class
ParameterizedType和Type都是java.lang.reflect包里面的類缨伊,查看源碼可以發(fā)現(xiàn)Type是個接口刻坊,class實現(xiàn)了該接口。

用法

假設(shè)有個User類漏益,包含String id,String name兩個字段绰疤。
1.如果obj對應(yīng)的是List<User>,則對應(yīng)的son解析的用法如下:

 Results<List<User>> results=Results.fromJson(json, 
            new TypeToken<List<User>>() {}.getType());
 List<User> list2=results.getObj();

2.如果obj對應(yīng)的是User,則對應(yīng)的json解析的用法如下:

 Results<User> results = Results.fromJson(json,User.class);
 User user = results.getObj();

總結(jié)與補充

  1.本文適用范圍是對于json結(jié)構(gòu)相同或相似的情況,當(dāng)然type方法可以用于很多其他的情況(type方法很強大)余爆。
  2.使用Gson解析json需要注意字段名的對應(yīng),Gson提供了@SerializedName("obj")的注解用于解決客戶端與服務(wù)器端實體類字段不一致的問題蛾方。
  3.本文實現(xiàn)的效果是對于結(jié)構(gòu)相同或者類似的json提供了更多一層的封裝桩砰,使得開發(fā)者可以只提供obj對應(yīng)的實體類(如果是list只需要提供list包含的類型對應(yīng)的實體類)即可亚隅。
  4.大家可以根據(jù)具體的需求在本文的基礎(chǔ)上進行改造懂鸵。

希望本文能為大家提供一種思路或者一種問題的解決方案,對于本文中涉及到的一些說法或者做法醉途,如果有不同見解的或者更好的實現(xiàn)方式的歡迎留言交流隘擎。遇到問題的也可以留言或者聯(lián)系QQ:1654088754货葬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹲姐,隨后出現(xiàn)的幾起案子柴墩,更是在濱河造成了極大的恐慌江咳,老刑警劉巖歼指,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宰掉,居然都是意外死亡轨奄,警方通過查閱死者的電腦和手機挪拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門谎柄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝巫,“玉大人石景,你說我怎么就攤上這事〕蹦酰” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵仗颈,是天一觀的道長椎例。 經(jīng)常有香客問我,道長凰棉,這世上最難降的妖魔是什么陌粹? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任福压,我火速辦了婚禮,結(jié)果婚禮上蒙幻,老公的妹妹穿的比我還像新娘胆筒。我一直安慰自己仆救,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布摧莽。 她就那樣靜靜地躺著顿痪,像睡著了一般镊辕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上石咬,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天卖哎,我揣著相機與錄音,去河邊找鬼厦章。 笑死照藻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幸缕。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼熟妓,長吁一口氣:“原來是場噩夢啊……” “哼栏尚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抬虽,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤纵菌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笛辟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序苏,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年弯菊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦铁。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡才漆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醇滥,到底是詐尸還是另有隱情,我是刑警寧澤阅虫,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布不跟,位于F島的核電站,受9級特大地震影響购城,放射性物質(zhì)發(fā)生泄漏虐译。R本人自食惡果不足惜瘪板,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一侮攀、第九天 我趴在偏房一處隱蔽的房頂上張望厢拭。 院中可真熱鬧,春花似錦蚪腐、人聲如沸税朴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觅廓。三九已至,卻和暖如春杈绸,著一層夾襖步出監(jiān)牢的瞬間矮瘟,已是汗流浹背塑娇。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哨啃,地道東北人写妥。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像祝峻,于是被迫代替她去往敵國和親次坡。 傳聞我的和親對象是個殘疾皇子呼猪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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