您的位置 首页 java

java编程老司机带你了解gson数据格式,你有知道吗?

不知道你们发现没有,你写完的程序无论当时怎么测试,过一段时间总会出 Bug 。再说一个每天都在发生的例子:在你写完一篇博客后,立即检查的话,总是查不出自己写的错别字。

据说这些都包含有一些大脑对当下事物处理的逻辑在里边,而且还有心理学因素在里边,我也不懂。反正现在就是程序出 Bug 了!出 Bug 了!! Bug !!!

事情是这样的,客户端请求服务器开放接口时,我们是以 JSON 字符串的形式返回的,这时候本来正常返回形式是这样:

{ 

但这个名字叫 Mafly 的人他不想让你知道他是男是女。就没填性别,程序中默认赋值为 null 了,JSON 序列化时就发生了意想不到的事儿。

重现一下那个 Bug

用于转换Java对象为 Json 字符串和把 Json 字符串转换为对象的工具类有很多,Gson、Jackson、FastJson等,我们用的是 Gson, 它是 Google 开发的,还据传说它的性能比较强大一些。嗯,对,我们用的就是这个。先看示例代码:

public static void main(String[] args) { 

你猜会输出上面那段我们预期的 Json 串吗?然而并不会。

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

就是这个当 Sex=null 时,用 Gson 的 tojson 方法会把 null 值忽略,从而序列化之后输出不包含这个属性值的 Json 串。其实我们的预期是输出 {“sex”: “”} {“sex”: null} , 那怎么做呢?

通过搜索引擎发现,网上大概存在以下三种解决方案:

  • 调用 toJson(Object src, Type typeOfSrc, JsonWriter writer) 方法

  • 注册自定义 TypeAdapter

  • 设置 serializeNulls 属性值( 推荐 )

前两种方式我没测试,推荐第三种方式,简单方便,源码如下:

 GsonBuilder gsonBuilder = new GsonBuilder(); 

输出符合我们的需求了, {“sex”: null} ,如图:

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

简单转到源码看了看,除了这一个设置还有很多,真是太方便了。调用 serializeNulls() 后, Gson 设置 serializeNulls 属性值为 true ,默认是 false ,源码:

public GsonBuilder serializeNulls() { this.serializeNulls = true; return this; 

重新认识一下 Gson

我看了几行 Gson 的源码后,我发现它可配置及特性多的数不胜数,可以用 @SerializedName 注解给属性重命名,用 @Expose 注解标识属性不进行序列化,支持 Map 的 key 为复杂对象的形式,日期类型转化为特定格式,还有区分版本进行显示,这些在日常项目中都极常用到,只不过好像我们之前都是自己实现的。

我简单建立了一个 UserInfo 实体类,里边包含了 username、age、sex 这三个属性值。试着测试了一下其中一两个:

1.@Expose 想让谁输出谁输出 ,注解代码如图:

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

设置 excludeFieldsWithoutExposeAnnotation() ,看下面第三行是输出:

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

2.@SerializedName 想怎么显示怎么显示 ,注解代码如图:

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

我想把 age 再 Json序列化时显示 maflyAge ,现在就可以了,输出如下图:

java编程老司机带你了解gson数据格式,你有知道吗?

java编程老司机带你了解gson数据格式,你有知道吗?

3.@Since、@Until 不同版本不同数据 ,注解代码如图:

java编程老司机带你了解gson数据格式,你有知道吗?

这里要设置 setVersion(3.2) @Since 标注的在 3.2 版本或之后才会输出, @Until 标注的只在 3.2 版本前才有。效果输出如下图:

java编程老司机带你了解gson数据格式,你有知道吗?

当然,还有好多特性呢,比如字段首字母大写阿、结果格式化阿等等,我这里抛个砖,剩下的有需要的可以试试。

总结一下

这是由于一个 Json 序列化输出后发现的小 Bug ,也可以说不能算 Bug ,因为是我们对于自己使用的工具类并不了解导致的,所以,去试着了解你使用的任何一个开源工具类或项目,对于遇到的问题可以很好的得到解决,从而也可以提升自己吧。

——————————————

如果喜欢请转发,小小支持一下。

更多精彩文章请关注 本头条号(小熊学IT ) 或 微信公众号 ITDetail(小熊学IT ),更有机会联系小熊为你在IT行业的答疑解惑……

文章来源:智云一二三科技

文章标题:java编程老司机带你了解gson数据格式,你有知道吗?

文章地址:https://www.zhihuclub.com/193012.shtml

关于作者: 智云科技

热门文章

网站地图