解決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打包則一切正常),因為客戶端程式碼中的
JavaBean(實體類)的欄位名稱必須與服務端返回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.** {*;}