最近作个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的解析,能够关心的不多。