Gson簡單使用

最近作個IM類型的Android 應用,因爲有三種客戶端(pc,ios,Android),因此底層使用的是C++與服務器通訊,因此通訊部分基本上有c++完成,封裝好Jni便可,能夠把底層c++通訊當作一個httpclient,Android上面只須要關注UI顯示便可。java

好的,交代好項目背景,下面介紹爲何使用gson。ios

因爲底層使用c++socket通訊,通訊的協議仍是,最原始的那種,好比先頂一個4個字節消息長度,而後根據長度,讀取這麼長度的數據,而後取出通訊的,消息號碼,而後讀出裏面的數據。c++

o,my god,作久了java,感受使用了這個,好像回到的原始社會了。程序員

因此咱們定義java與c++之間通訊使用jni,傳輸的協議所有都是字符串,字符串裏面使用json。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的不一樣,來進行分發,而後解析。socket

若是使用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的解析,能夠關心的不多。

相關文章
相關標籤/搜索