最近做个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的解析,可以关心的很少。

Gson简单使用的更多相关文章

  1. 用gson 解 json

    1.json 简单介绍 轻量级数据存储传输文件,比xml精简. 2.Gson简单介绍 android中解json方式很多,比较常用json-lib  goole-Gson. json-lib要包含的包 ...

  2. json和gson的区别

    json是一种数据格式,便于数据传输.存储.交换gson是一种组件库,可以把java对象数据转换成json数据格式 GSON简单处理JSON json格式经常需要用到,google提供了一个处理jso ...

  3. Java创建和解析Json数据方法(五)——Google Gson包的使用

    (五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法:         ①toJson():将java对象转化为json数据 ...

  4. java基础知识-序列化/反序列化-gson基础知识

    以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...

  5. BOS物流管理系统-第五天

    BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...

  6. 【Android进阶】Gson解析json字符串的简单应用

    在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...

  7. gson和fastjson将json对象转换成javaBean 简单对照

    今天在网上看代码时,发现项目使用了Gson,用于将json字符串转换成javaBean. 以前没使用过Gson,随即,简单入了个们, 想起fastjson也有将json字符串转换成javaBean的A ...

  8. Okhttp、Volley和Gson的简单介绍和配合使用

    转载自:http://www.apkbus.com/home.php?mod=space&uid=784586&do=blog&id=61255 1.okhttp是一个高效的. ...

  9. gson的简单使用方法

    gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的 ...

随机推荐

  1. cxf soap rest webservice spring

    1. 导入 jar 包 2. 编写接口 3. 编写实现 4. 配置spring 配置文件 5. 配置web.xml servlet 6. 访问 package com.diancai.test; im ...

  2. part1:5Linux命令详解

    1.Linux命令介绍 Linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.磁盘驱动器.键盘.鼠标还是用户等都是文件.Linux系统管理的命令是它正常运行的 ...

  3. 2018软工项目UML设计(团队)

    团队信息 队名:火箭少男100 本次作业课上成员 短学号 名 本次作业博客链接 2507 俞辛(临时队长) https://www.cnblogs.com/multhree/p/9821080.htm ...

  4. 2018.09.22 牧场的安排(状压dp)

    描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...

  5. 2018.09.15 秘密的牛奶管道SECRET(次小生成树)

    描述 约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线.一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式. 现在有W(3 <= W & ...

  6. sqlserver 清除日志

    要使用Master数据库执行 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件-- ...

  7. 函数作用域和块级作用域--你不知道的JavaScript

    et和const在{}内声明都会变为外部不能访问的值,但是const声明的是常量,也不能修改 函数是 JavaScript 中最常见的作用域单元.本质上,声明在一个函数内部的变量或函数会在所处的作用域 ...

  8. 安装hue-3.11.0

    1) 配置HDFS HttpFS和WebHDFS 如果HDFS是HA方式部署的,则只能使用HttpFS,而不能用WebHDFS. 2) 安装依赖: apr-iconv-1.2.1 confuse-3. ...

  9. c# Clipboard.SetDataObject(bmp1) 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常

    c# Clipboard.SetDataObject(bmp1)  在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttri ...

  10. python 实现判断一个用户输入字符串是否是小数的小程序

    要判断一个字符串是否是小数:1先判断小数点的个数,即如果是小数,则必须有且仅有一个'.'号2再分别判断'.'号的左右两边是否是数字: 判断左边时,如果负数,则左边包含'-'号:必须以'-'号开头(校验 ...