GsonSwaggerConfig.java
@Configuration public class GsonSwaggerConfig { //设置swagger支持gson @Bean public IGsonHttpMessageConverter IGsonHttpMessageConverter() { return new IGsonHttpMessageConverter(); } }IGsonHttpMessageConverter.java
public class IGsonHttpMessageConverter extends GsonHttpMessageConverter { public IGsonHttpMessageConverter() { //自定义Gson适配器 super.setGson(new GsonBuilder() .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter()) .serializeNulls()//空值也参与序列化 .create()); } }SpringfoxJsonToGsonAdapter.java
public class SpringfoxJsonToGsonAdapter implements JsonSerializer<Json> { @Override public JsonElement serialize(Json json, Type type, JsonSerializationContext jsonSerializationContext) { return new JsonParser().parse(json.value()); } } @Mapping JsonObject作为入参异常有时候,我们会在入参使用类似:
public ResponseResult<String> submitAudit(@RequestBody JsonObject jsonObject) {}如果使用这种代码,其实就是使用Gson来解析json字符串。但是这种写法的风险是很高的,平常请大家尽量避免使用JsonObject直接接受参数。
在Gson中,JsonObject若是有数字字段,会统一序列化为double,也就是会把count = 0这种序列化成count = 0.0。
为何会有这种情况?简单的来说就是Gson在将json解析为Object类型时,会默认将数字类型使用double转换。
如果Json对应的是Object类型,最终会解析为Map<String, Object>类型;其中Object类型跟Json中具体的值有关,比如双引号的""值翻译为STRING。我们可以看下数值类型(NUMBER)全部转换为了Double类型,所以就有了我们之前的问题,整型数据被翻译为了Double类型,比如30变为了30.0。
可以看下Gson的ObjectTypeAdaptor类,它继承了Gson的TypeAdaptor抽象类:
具体的源码分析和原理阐述,大家可以看这篇拓展阅读:
https://www.jianshu.com/p/eafce9689e7d
解决方案:
第一个方案:把入参用实体类接收,不要使用JsonObject
第二个方案:与上面的解决Date类型问题类似,自己定义一个Adaptor,来接受数字,并且处理。这种想法我觉得可行但是难度较大,可能会影响到别的类型的解析,需要在设计适配器的时候格外注意。
总结这篇文章主要是为了那些需要将项目迁移到Gson框架的同学们准备的。
一般来说,个人小项目,是不需要费这么大精力去做迁移,所以这篇文章可能目标人群比较狭窄。
但文章中也提到了不少通用问题的解决思路,比如怎么评估迁移框架的必要性。其中需要考虑到框架兼容性,两者性能差异,迁移耗费的工时等很多问题。
希望文章对你有所帮助。
参考《如何从Fastjson迁移到Gson》
https://juejin.im/post/6844904089281626120
《FastJson迁移至Jackson》此文作者自己封装了工具类来完成迁移
https://mxcall.github.io/posts/工作/程序员/javaSE/FastJson迁移至Jackson/
《你真的会用Gson吗?Gson使用指南》
https://www.jianshu.com/p/e740196225a4
json性能对比
https://github.com/zysrxx/json-comparison/tree/master/src/main/java/json/comparison
fastjson官方文档
https://github.com/alibaba/fastjson/wiki
易百教程
https://www.yiibai.com/jackson
关注我我是一名奋斗在一线的互联网后端开发工程师。
主要关注后端开发,数据安全,边缘计算等方向,欢迎交流。
各大平台都能找到我
微信公众号:后端技术漫谈
Github:@qqxx6661
CSDN:@蛮三刀把刀
知乎:@后端技术漫谈
掘金:@蛮三刀把刀
腾讯云+社区:@后端技术漫谈
博客园:@后端技术漫谈
BiliBili:@蛮三刀把刀
原创文章主要内容
后端开发实战(Java为主)
技术面试
算法题解/数据结构/设计模式
我的生活趣事
个人公众号:后端技术漫谈
如果文章对你有帮助,不妨点赞,收藏起来~