1.情景展示
如上图所示,实体类转json,在Java开发中还是很常见的,问题在于:Java属性名称首字母是大写,要求转成json后首字母也必须是大写,如何实现?
2.原因分析
我们知道在Java规范中,实体类的属性名的命名规范需要遵循首字母小写的驼峰命名法,既是规范也是约束也是牢笼。这个时候一旦有人不按规范走,就会发生有趣的事情(一会再说)。
先来看看Java实体类构成:
开始尝试
使用netJson
如上图所示,首字母被强转小写,既然不行,就换一个json;
使用aliJson
照样不行。
此时,被关在笼子里的人就会炸开了锅:WAHT FUCK,两个json都不支持,你为什么不按规范走?此时,就会被冲昏头脑,去指责对方而不是承认自己的无能。
3.解决方案
规范是死的,人是活的,所以,我才说规范有时会像牢笼,束缚着我们前进的脚步,不敢越雷池一步。解决办法还是有的。
引入谷歌的GSON
大功告成。
说明:
这里需要注意的是,使用谷歌的Gson将实体类转json,key的名称会完完全全照搬类的属性名称,但是,它只能完成实体类到json字符串的转换,如果需要转成json对象,再调用ali/net均可。
如果不喜欢这种实现方式,还可以迭代json取值,将key的首字母转大写,也是可以哒。
4.Bug
使用gson将实体类转成json字符串的这种方式,会有一个弊端:
如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码,如下图所示:
解决方案,见文末推荐。
2021-03-16
5.第二种解决方案
使用Jackson也可以实现同样的效果
如果你的项目框架使用的是springboot的话,就无需引用jackjson的jar包了,springboot就是使用的jackjson完成json的序列化和反序列化的;
如何验证一下呢?
在idea中,打开maven视图
实体类
错误示例:
我们会发现,首字母也全都被强制转换成了小写,是不是这就说明Jackson也不行?
分析:
正常情况下,在springboot中,为了解决前后端字段不一致的问题,我们通常在实体类接收前端请求参数或者响应给前端参数时,通常使用@JsonProperty注解完成字段的映射问题。
那么,我们是不是也可以这样使用呢,一起来试一下
正确示例:
这样,Jackson在序列化时,就会取@JsonProperty注解所声明的字段作为json的key。
深入探究
Jackson的其它注解是不是也是可以使用呢?
常用的还有@JsonFormat和@JsonIgnore
执行结果如下:
两个注解都没有生效,但如果将这个实体类直接返回给前端的话,springboot会作出注解对应的处理。
6.两种方案对比
区别一:实体类属性没有赋值
如果没有赋值的属性的数据类型是基础数据类型(八种基本数据类型:byte,short,int,long,double,float,boolean,char),两者都会自动为其属性值设置默认值
如果没有赋值的属性的数据类型是封装类(非基本数据类型)
Gson:该属性就不会作为key出现
Jackson:会自动填充值为null
区别二:html编码
Gson:如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码(当然,有解决访问,见文末推荐)
Jackson:不会对其进行编码,保持原样
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
作者:Marydon