解決android使用gson解析json字符串,並使用混淆編譯方式打包apk遇到的問題

解決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.** {*;}

發佈留言