Gson简单使用
最近做个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简单使用的更多相关文章
- 用gson 解 json
1.json 简单介绍 轻量级数据存储传输文件,比xml精简. 2.Gson简单介绍 android中解json方式很多,比较常用json-lib goole-Gson. json-lib要包含的包 ...
- json和gson的区别
json是一种数据格式,便于数据传输.存储.交换gson是一种组件库,可以把java对象数据转换成json数据格式 GSON简单处理JSON json格式经常需要用到,google提供了一个处理jso ...
- Java创建和解析Json数据方法(五)——Google Gson包的使用
(五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法: ①toJson():将java对象转化为json数据 ...
- java基础知识-序列化/反序列化-gson基础知识
以下内容来之官网翻译,地址 1.Gson依赖 1.1.Gradle/Android dependencies { implementation 'com.google.code.gson:gson:2 ...
- BOS物流管理系统-第五天
BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...
- 【Android进阶】Gson解析json字符串的简单应用
在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...
- gson和fastjson将json对象转换成javaBean 简单对照
今天在网上看代码时,发现项目使用了Gson,用于将json字符串转换成javaBean. 以前没使用过Gson,随即,简单入了个们, 想起fastjson也有将json字符串转换成javaBean的A ...
- Okhttp、Volley和Gson的简单介绍和配合使用
转载自:http://www.apkbus.com/home.php?mod=space&uid=784586&do=blog&id=61255 1.okhttp是一个高效的. ...
- gson的简单使用方法
gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的 ...
随机推荐
- 5 个关键点!优化你的 UI 原型设计
当你和你的团队着手开始一个产品开发的时候,最开始的一步一般是绘制线框图,这是大部分产品项目的第一步,它不复杂但是却对整个产品的完成形态和质量有着至关重要的作用. 很多刚开始工作设计师或者产品经理都会提 ...
- stl学习记录(2)
#include <iostream> #include <utility> #include <tuple> #include <complex> # ...
- Python 函数装饰器简明教程
定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...
- 2018.06.30 BZOJ4443: [Scoi2015]小凸玩矩阵(二分加二分图匹配)
4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N< ...
- 2018.07.10NOIP模拟 Draw(容斥原理)
Draw 题目背景 SOURCE:NOIP2016-RZZ-4 T3 题目描述 给定笛卡尔坐标系上 n 个不重复的点. 定义一个 L 形为: 一个形如 (x,y),(x+1,y)-(x+a,y),(x ...
- python编码(四)
一.预备知识 字符集 1, 常用字符集分类 ASCII及其扩展字符集作用:表语英语及西欧语言.位数:ASCII是用7位表示的,能表示128个字符:其扩展使用8位表示,表示256个字符.范围:ASCII ...
- Javascript 中函数的 length 属性
每个函数都有一个 length属性 (函数名.length), 表示期望接收的函数的个数(而不是实际接收的参数个数) 它与arguments不同. arguments.length 是表示函数实际接收 ...
- MFC中开发ocx控件,html容器收不到ocx的事件Event
问题背景: MFC开发ocx控件,主窗口就是ctrl类,主窗口类中调度接口和事件映射添加,执行OK,外部html容器中接收事件成功,如下: ctrl.h中声明事件映射函数 void EVTPENSIG ...
- hdu 4268 贪心+set lower_bound用法
http://acm.hdu.edu.cn/showproblem.php?pid=4268 A想用手里的牌尽量多地覆盖掉B手中的牌.. 牌有h和w 问A手中的牌最多能覆盖B多少张牌 iterator ...
- DFS剪枝处理HDU1010
http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意很好理解,不是最短路,而是dfs,虽然地图不算大,稍微注意一点的dfs也能险过,但是700+ms和78 ...