最近做个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. 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)

    传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...

  2. 2018.09.19 atcoder AtCoDeer and Rock-Paper(贪心)

    传送门 sb贪心啊. 显然能选帕子就选帕子. 首先假设第一个人全出石头. 考虑把一些石头修改成帕子. 这样贡献只增不减,加起来就是答案. 代码: #include<bits/stdc++.h&g ...

  3. StackView实现叠加在一起的图片循环移动像循环队列一样

    MainActivity.java public class MainActivity extends Activity {   StackView stackView; int[] imageIds ...

  4. NATAPP打穿内网

    前一篇博文写了ngrok作为内网穿透工具现在开始开始学习另外一种内 网穿透natapp(他也是基于ngrok的一种高速内网穿透服务)多的介绍就 不说了,开始进入正题. 第一步:先登录natapp官网( ...

  5. cmake检测g++编译器是否支持c++11

    # 相关链接:https://cmake.org/cmake/help/v3.0/module/CheckCXXCompilerFlag.html​​include(CheckCXXCompilerF ...

  6. (回文串 Manacher )Girls' research -- hdu -- 3294

    http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit:1000MS     Memory Limit:32 ...

  7. SpringMvc中controller之间的方法调用

    方法一, return new ModelAndView("redirect:"+新地址); 方法二, response.sendRedirect(新地址); return nul ...

  8. hbase使用MapReduce操作3(实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中)

    Runner类 实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中. package com.yjsj.hbase_mr; import org.apache.hadoo ...

  9. node express session

    在express4.0版本以上,需要单独增加session模块:express-session:https://www.npmjs.com/package/express-session 具体做法是, ...

  10. EBS trace分析

    下载Trace Analyzer,打开bin下的traceanalyzer.bat 即可分析EBS的trace文件,图形化界面,无需tkprof 需要配置javahome,确认java版本为1.6以上 ...