Gson簡單使用

wangbo460 9年前發布 | 9K 次閱讀 Android開發 移動開發

來自: http://blog.csdn.net//guijiaoba/article/details/22484927


最近做個IM類型的Android 應用,由于有三種客戶端(pc,ios,Android),所以底層使用的是C++與服務器通信,所以通信部分基本上有c++完成,封裝好Jni即可,可以把底層c++通信看成一個httpclient,Android上面只需要關注UI顯示即可。

好的,交代好項目背景,下面介紹為什么使用gson。

由于底層使用c++socket通信,通信的協議還是,最原始的那種,比如先頂一個4個字節消息長度,然后根據長度,讀取這么長度的數據,然后取出通信的,消息號碼,然后讀出里面的數據。

o,my god,做久了java,感覺使用了這個,好像回到的原始社會了。

所以我們定義java與c++之間通信使用jni,傳輸的協議全部都是字符串,字符串里面使用json。

做久了J2ee,所以很講究封裝。大概才傳輸協議時這樣。

cmd是通信的消息編碼,param:表示一個隨機的標示,由于通信是異步的,所以req對于的resp,需要額外的添加一個標示符,來找到對于的resp。data里面就是一個通信的的內容,resp里面添加一個字段,retcode,表示服務器的響應,0為成功,1表示網絡問題,這個根據實際需要來定義

req:{"cmd":100,"param":"0cee5015-aae6-4f67-b03e-7e95168b6563","data":{xxxxxxx}}

resp{"cmd":100,"retCode":0,"param":"f56f8e16-ba82-429f-b724-8e4da6d4ac03","data":{xxxxx}}


這樣的簡單通信協議相信很多人都是懂的,關鍵是data里面的數據時不一樣的,項目需要根據cmd的不同,來進行分發,然后解析。

如果使用Android自帶的json解析類,那么要化很多時間進行解析,所以在這里使用gson,gson是google的開源json解析工具。官網是http://code.google.com/p/google-gson/

gson使用還是比較簡單的,比如:

public class User {

    public Name name;
    public String passwd;
    public int age;
    public char sex;
    public String[] telphone;

    public String toString() {
        return "User [name=" + name + ", passwd=" + passwd + ", age=" + age + ", sex=" + sex + ", telphone=" + Arrays.toString(telphone) + "]";
    }
}
public class Name {

    public String firstName;
    public String lastName;

    public String toString() {
        return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";
    }
}
public class Main {

    public static void main(String[] args) {
        Gson gson = new Gson();

        Name n = new Name();
        n.firstName = "liushui";
        n.lastName = "bufu";
        User u = new User();
        u.age = 25;
        u.name = n;
        u.passwd = "123456";
        u.sex = 'M';

        String[] phone = new String[10];
        for (int i = 0; i < phone.length; i++) {
            phone[i] = "1381234567" + i;
        }
        u.telphone = phone;

        System.out.println(u);
        String json = gson.toJson(u);

        System.out.println(json);

        User u2 = gson.fromJson(json, User.class);
        System.out.println(u2);
    }
}

代碼運行的結果是:

User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]
{"name":{"firstName":"liushui","lastName":"bufu"},"passwd":"123456","age":25,"sex":"M","telphone":["13812345670","13812345671","13812345672","13812345673","13812345674","13812345675","13812345676","13812345677","13812345678","13812345679"]}
User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]



gson很好完成json的解析與生成,很好的完成了數據的序列化與反序列化。

gson默認使用的是字段的的名字,在這里我沒有使用setter和getter方法,直接把字段進行的public處理,實際情況需要根據項目需要來使用,有的時候項目需要使用代碼混淆的時候需要注意下,一種解決方法是不把字段進行混淆,或者是使用gson提供的標注來解決。

對上面的代碼進行修改,可以得到如下結果。

public class User {

    @SerializedName("_name")
    public Name name;
    @SerializedName("_passwd")
    public String passwd;
    @SerializedName("_age")
    public int age;
    @SerializedName("_sex")
    public char sex;
    @SerializedName("_telphone")
    public String[] telphone;

    public String toString() {
        return "User [name=" + name + ", passwd=" + passwd + ", age=" + age + ", sex=" + sex + ", telphone=" + Arrays.toString(telphone) + "]";
    }
}

User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]
{"_name":{"firstName":"liushui","lastName":"bufu"},"_passwd":"123456","_age":25,"_sex":"M","_telphone":["13812345670","13812345671","13812345672","13812345673","13812345674","13812345675","13812345676","13812345677","13812345678","13812345679"]}
User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]


生成的json字符串是帶有下劃線的,也就是@SerializedName里面定義的別名。

另外上面所說的通信協議中的data的結構體是不確定的,有的時候是一個字符串,或者是一個實體類或者是數組,為了滿足面向對象的規則,可以使用json里面的JsonObject來表示,這樣可以根據json里面的內容,自動匹配,再結合java中的泛型,既可以完美解決通信模塊,程序員可以竟可能的把經歷放在ui和邏輯上,通信和json的解析,可以關心的很少。

 本文由用戶 wangbo460 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!