java学习基地

微信扫一扫 分享朋友圈

已有 1555 人浏览分享

重新认识一个强大的 Gson

[复制链接]
1555 2
本帖最初由 进修派 于 2020-12-7 20:51 编纂



醋蠡个 Bug 提及
没有明白您枚挞现出有,您写完的法式不管其时怎样测试,过冶工夫总会出 Bug 。再道一个天天皆正在发作的例子:正在您写完一篇专客后,立刻查抄的话,老是查没有出本人写的错别字。

听说那些皆包罗有一些年夜慕当下事物处置的逻辑正在里边,并且另有心思教身分正在里边,我也没有懂。归正如今便是法式出 Bug 了!出 Bug 了!! Bug !!!
工作是如许的,客户端恳求效劳器开放接心时,我们是以 JSON 字符串的情势返回的,这时候候原来一般返回情势是如许:

12345
{    "name": "mafly",    "age": "18",    "sex": "男"}

但那个名字叫Mafly的人他没有念让您明白他是男是女。便出挖性别,法式中默许赋值为 null了,JSON 序量时便发作了意念没有到的事女。


重现一下谁人 Bug

用于转换Java工具为 Json 字符串战把 Json 字符串转话讵工具的东西类有许多,Gson、Jackson、FastJson等,我们用的是 Gson, 它是 Google 开辟的,借据传道它的机能比力壮大一些。嗯,对,我们用的便是那个。先看示例代码:

12345678910
public static void main(String[] args) {     HashMap<String, Object> map = new HashMap<String, Object>();    map.put("name", "mafly");    map.put("age", "18");    map.put("sex", null);     String jsonString = new Gson().toJson(map);    System.err.println(jsonString);}

您猜会输出上里那段我玫沥期的 Json 串吗?但是其实不会。


便是那个当 Sex=null时,用 Gson 的tojson办法会把 null 值疏忽,从而序量以后输出没有包罗那个属性值的 Json 串。实在我们的预期是输出 {"sex": ""} 或 {"sex": null}, 牡刘么做呢?

经由过程搜刮引擎发明,网上大要存正在以下三种处理计划:

  • 挪用 toJson(Object src, Type typeOfSrc, JsonWriter writer) 办法
  • 注册捉义 TypeAdapter
  • 设置 serializeNulls 属性值(保举)


前两种方法我出测试,保举第三种方法,简朴便利,源码以下:

123
GsonBuilder gsonBuilder = new GsonBuilder();String jsonString1 = gsonBuilder.serializeNulls().create().toJson(map);System.err.println(jsonString1);

输出契合我们的需供了, {"sex": null},如图:



简朴转到源码看了看,除那一个设殖龉有许多,实是太便利了。挪用serializeNulls()后, Gson 设置 serializeNulls 属性值为 true,默许是false,源码:

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



从头熟悉一下 Gson
我看了几止 Gson 的源码后,我发明它可设置及特征多的不可胜数,能够用@SerializedName注解给属性重定名,用@Expose注解标识属性没有停止序量,撑持 Map 的 key 为庞大工具的情势,日期范例转化为特定格局,另有辨别版本停止显现,那些正在一样平常项目中皆极经常使用到,只不外仿佛我们之前皆是本人完成的。
我简朴成立了一个 UserInfo 真体类,里边包罗了username、age、sex那三个属性值。试着测试了一下此中一两个:

1.@Expose 念让谁输出谁输出,注解代码如图:
设置excludeFieldsWithoutExposeAnnotation(),看上面第三止是输出:


2.@SerializedName 念怎样显现怎样显现,注解代码如图:
我念把age再 Json序量时显现maflyAge,如今就能够了,输出以下图:


3.@Since、@Until 差别版本差别数据,注解代码如图:
那里要设置setVersion(3.2),@Since标注的正在 3.2 版本或以后才会输出,@Until标注的只正在 3.2 版本前才有。结果输出以下图:


固然,另有很多多少特征呢,好比字段尾字母年夜写阿、成果格局化阿等等,我那里扔个砖,剩下的又硅要的能够尝尝。

总结一下
那是因为一个 Json 序量输出后发明的小 Bug ,也能够道不克不及算 Bug ,由于是我们关于本人利用的东西类其实不理解招致的,以是,来试着理解您利用的任何一个开源东西类或项目,关于碰到的成绩能够很好的获得处理,从而也能够提拔本人吧。

我明天提出的┞封些皆是 Gson 的小小特征,另有许多等候各人发明,等待一块交换生长。



举报 使用道具

回复

评论 2

青春舞曲  vip终身会员  发表于 2020-12-22 19:31:03 | 显示全部楼层
不错 支持下

举报 使用道具

回复
小白兔  vip终身会员  发表于 2020-12-22 19:35:35 | 显示全部楼层
LZ是天才,坚定完毕

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-8-4 10:45 , Processed in 0.659205 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.