Gson的使用与理解
当今社会下,前后端分离,不同系统的信息交互,消息队列的数据传递,微服务的不同服务之间的数据处理,越来越多地方用到了序列化。序列化作为不同系统不同服务之间的数据桥梁。那么方便快捷的序列化工具还是必要的。
相对应配置在springboot本身的消息队列,使用gson进行代码中转化,具有不同情境下使用不同配置的优势。
该需求的来源还是来资源我这边和C#开发的系统进行数据对接时,导致的一些小问题。
我大致描述下对面系统的开发形式。现阶段,大家都是使用实体类的形式将整个实体类进行统一序列化。对方系统采用的是实体类嵌套实体类,关键该实体类还是写在同一个class下面的,也就存在一个问题,相同类型的实体类,写在不同class下面后导致部分的字段会存在一定的差异,虽然对面尽量避免这个问题了,但是偶尔还是出来了。更为关键的是,他们的首字母存在一会大写,一会小写的情况。给出的文档让我。
那么我这边采用字符串接收的形式,接收到之后,我再通过通过Gson的形式进行数据实例化。
那么在使用Gson的时候需要GsonBuilder来创建通过其进行gson实例化的简单配置。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 private final Gson gson = new GsonBuilder()//建造者模式设置不同的配置
2 .serializeNulls()//序列化为null对象
3 .disableHtmlEscaping()//防止对网址乱码 忽略对特殊字符的转换
4 .registerTypeAdapter(String.class, new StringConverter())//对为null的字段进行转换
5 .registerTypeAdapter(Date.class, new DeanDateConverter())//对为null的字段进行转换
6 .create();
Gson创建
小伙伴们可以看到,我的类型适配是存在两个的,一种是String类型,一种是Date类型。String类型大家都好理解,为什么要使用Date类型呢,因为对面大量使用了java中的DateTime时间格式,中间还夹杂着正常的时间格式。DateTime默认事件格式是中间存在T的。那么就给自动转化时间类型提高了难度。那么干脆点,我直接将定义为Date类型的对应数据拉出来,通过字符串解析进行控制,不同的类型走不同的转换。
这里逻辑比较简单,我就直接上源码了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
import com.google.gson.*;
import org.apache.http.util.TextUtils; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*; public class GsonBinder { //定义并配置gson
private final Gson gson = new GsonBuilder()//建造者模式设置不同的配置
.serializeNulls()//序列化为null对象
// .setDateFormat("yyyy-MM-dd HH:mm:ss") //设置日期的格式
.disableHtmlEscaping()//防止对网址乱码 忽略对特殊字符的转换
.registerTypeAdapter(String.class, new StringConverter())//对为null的字段进行转换
.registerTypeAdapter(Date.class, new DeanDateConverter())//对为null的字段进行转换
.create(); /**
* 对解析数据的形式进行转换
*
* @param obj 解析的对象
* @return 转化结果为json字符串
*/
public String toJsonStr(Object obj) {
if (obj == null) {
return "";
}
try {
return gson.toJson(obj);
} catch (Exception e) {
return "";
}
} /**
* 解析为一个具体的对象
*
* @param json 要解析的字符串
* @param obj 要解析的对象
* @param <T> 将json字符串解析成obj类型的对象
* @return
*/
public <T> T toObj(String json, Class<T> obj) {
//如果为null直接返回为null
if (obj == null || TextUtils.isEmpty(json)) {
return null;
}
try {
return gson.fromJson(json, obj);
} catch (Exception e) {
e.printStackTrace();
return null;
} } /**
* @return 不区分类型 传什么解析什么
*/
public <T> T toObj(String jsonStr, Type type) {
return gson.fromJson(jsonStr, type);
} /**
* 将Json数组解析成相应的映射对象列表
* 解决类型擦除的问题
*/
public <T> List<T> toList(String jsonStr, Class<T> clz) {
List<T> list = gson.fromJson(jsonStr, new type(clz));
if (list == null) list = new ArrayList<>();
return list;
} public <T> Map<String, T> toMap(String jsonStr, Class<T> clz) {
Map<String, T> map = gson.fromJson(jsonStr, new type(clz));
if (map == null) map = new HashMap<>();
return map;
} private class type implements ParameterizedType {
private Type type; private type(Type type) {
this.type = type;
} @Override
public Type[] getActualTypeArguments() {
return new Type[]{type};
} @Override
public Type getRawType() {
return ArrayList.class;
} @Override
public Type getOwnerType() {
return null;
}
} }
Gson代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 import com.google.gson.*;
2 import com.seekingtrue.dean.unit.DeanUtils;
3 import org.joda.time.DateTime;
4
5 import java.lang.reflect.Type;
6 import java.text.ParseException;
7 import java.util.Date;
8
9 public class DeanDateConverter implements JsonSerializer<Date>, JsonDeserializer<Date> {
10
11 @Override
12 public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
13 System.out.println("时间类型");
14 String deanTemp = json.toString().replace("\"","");
15 Date needDate=null;
16 if (deanTemp.equals("null")){
17 return needDate;
18 }
19 if (deanTemp.indexOf("T")!=-1){
20 DateTime dateTime = new DateTime(deanTemp);
21 needDate = dateTime.toDate();
22 }else {
23 DeanUtils deanUtils = new DeanUtils();
24 String fommate = "yyyy-MM-dd HH:mm:ss";
25 fommate.substring(0,deanTemp.length());
26 try {
27 deanUtils.changeStringToDate(deanTemp,fommate);
28 } catch (ParseException e) {
29 return null;
30 }
31 }
32 return needDate;
33 }
34
35 @Override
36 public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
37 if (src==null){
38 return null;
39 }
40 DateTime dateTime = new DateTime(src);
41 return new JsonPrimitive(dateTime.toString());
42 }
43 }
时间类型转换
那么同一个字段不同名称如何处理呢,那么还是使用gson本身的配置功能。 @SerializedName(value = "BingRenID",alternate = {"bingRenID"}),别名多了就多配置点。问题就不大了。
Gson的使用与理解的更多相关文章
- 完全理解Gson(1):简单入门
GSON是Google开发的Java API,用于转换Java对象和Json对象.本文讨论并提供了使用API的简单代码示例.更多关于GSON的API可以访问:http://sites.google.c ...
- 完全理解Gson(2):Gson序列化
通过调用 Gson API 可以把 Java 对象转换为 JSON 格式的字符串(项目主页).在这篇文章中,我们将会讲到如何通过 Gson 默认实现和自定义实现方式,将 Java 对象转换为 JSO ...
- 完全理解Gson(3):Gson反序列化
完全理解Gson(2):Gson序列化 完全理解Gson(1):简单入门 本文延续前一篇文章,继续介绍简单基本的Gson用法.这篇文章我们将介绍如何将复杂的JSON对象解析为Java对象,其中Java ...
- 从高处理解android与服务器交互(看懂了做开发就会非常的容易)
今天帮一个朋友改一个bug 他可以算是初学者吧 .我给他看了看代码,从代码和跟他聊天能明显的发现他对客户端与服务器交互 基本 不是很了解.所以我花了更多时间去给他讲客户端与服务器的关系.我觉得从这个高 ...
- json工具包比较 fastjson jackson gson
对json进行json-object进行相互转化时,笔者接触到三种工具jar,现对其进行比较. fastjson:速度最快,阿里巴巴开源. jackson:springMvc 默认使用. gson:谷 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Gson ------ 实例演习
[本文范围]: 本文并非JSON知识讲解资料,亦非GSON知识讲解资料,而是通过实例让开发人员了解通过Gson如何使Java对象和Json对象进行相互转换. [JSON参考资料]: Json快速入门: ...
- JSON数据解析及gson.jar包
从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送. 服务器端的编程语言只能以如下 3 种格式返回数据: HTML XML JSON JSON一种简单的数据格式,比xml更轻巧. JS ...
- 关于Gson定制的分析
首先,为什么需要定制呢?很多同学可能觉得默认的不也挺好的嘛?最开始,我也是觉得的,而且我们一开始也是用默认的解析方式的,因为我们与外部约定的数据格式一直都比较稳定.但当外部数据不稳定,那么Gson默认 ...
随机推荐
- [Linux] 如何在 Linux 电脑上制作专业的视频教程
目录 前言 1.软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2.视频教程制作 3.效果 参考链接 前言 博主使用 Arch Linux ...
- mac下安装YII
新换了台电脑,一个mac,特蛋疼的各种环境安装.两个多小时,总算把开发环境配好了. XAMPP就不用说了,phpstorm(javaEE 6.0),navicat for mysql ,一堆的注册码, ...
- Dubbo源码(六) - 服务路由
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊点短的,服务路由Router,本文讲的是路由的调用路径,不讲路由的规则解析.想了解规则 ...
- 利用MySQL Router构建读写分离MGR集群
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 部署MySQL Router 2. 启动mysqlrouter服务 3. 确认读写分离效果 4. 确认只读负载 ...
- 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...
- 关于Redis在windows上运行及fork函数问题
Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成.微软的一些工程师花费时间在解决在 ...
- redis-string类型命令
一.APPEND key value 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾. 如果 key 不存在,那么它将首先创建一个空字符串的ke ...
- 第十篇:vue.js for循环语句(大作业进行时)
Vue.js 循环语句 <div id="app"> <ol> <li v-for="site in sites"> /*f ...
- 第三十七篇:JS基础(this)
好家伙, 解析器(浏览器)在调用函数是每次都会响函数内部传递进一个隐含的参数, 这个隐含参数就是this,this指向的是一个对象,由浏览器传过来 这个对象我们成为函数执行的上下文对象 根据函数的调用 ...
- 发现tab换成空格不起作用,然后解决如下。
今天发现把 .vimrc 加了set expandtab之后不起作用,这个本来是把代码中的制表符换成空格,免得不同人的设置不同造成代码缩进混乱. 然后搞了半天搞不定,应该是加载了.vimrc之后又加了 ...