1. 程式人生 > >使用Gson解析json在打包混淆時出錯的解決方法

使用Gson解析json在打包混淆時出錯的解決方法

解決android使用gson解析json字串,並使用混淆編譯方式打包apk遇到的問題 方法一: Gson gson = new Gson(); // 將json格式字串轉化為List<物件> Type listType = new TypeToken<ArrayList<PersonMsgMini>>(){}.getType(); personMsgList = gson.fromJson(jsonObject.getString("list"), listType); 方法二: public class AttendanceMsgGson { //欄位名要跟json字串中的key一致 private ArrayList<AttendanceMsg> list; public ArrayList<AttendanceMsg> getList() { return list; } public void setList(ArrayList<AttendanceMsg> list) { this.list = list; } } Gson gson = new Gson(); AttendanceMsgGson attGson = gson.fromJson(result, AttendanceMsgGson.class); 下面是重點: 說明: 其中兩種gson解析json字串的方法都沒有問題,問題主要是使用了混淆編譯的方式進行apk打包(其中不混淆編譯進行apk打包則一切正常),因為客戶端程式碼中的
Java
Bean(實體類)的欄位名稱必須與服務端返回json字串中的key要一致,才能進行解析,而混淆編 譯之後,客戶端程式碼中的JavaBean(實體類)的類名與其欄位名稱全部變成了a、b、c、d等等字串,這與服務端返回的json字串中的key不一致,導致解析失敗。所以,解決的辦法是:在進行混淆編譯進行打包apk的時候,過濾掉存放所有JavaBean(實體類)的包不進行混淆編譯。經過測試,一切正常。 在proguard.cfg檔案中新增: # removes such information by default, so configure it to keep all of it.  -keepattributes Signature  # Gson specific classes  -keep class sun.misc.Unsafe { *; }  #-keep class com.google.gson.stream.** { *; }  # Application classes that will be serialized/deserialized over Gson  -keep class com.google.gson.examples.android.model.** { *; } //這句非常重要,主要是濾掉 com.bgb.scan.model包下的所有.class檔案不進行混淆編譯 -keep class com.bgb.scan.model.** {*;}