废弃fastjson!大型项目迁移Gson保姆级攻略 (4)

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抽象类:

废弃fastjson!大型项目迁移Gson保姆级攻略

具体的源码分析和原理阐述,大家可以看这篇拓展阅读:

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为主)

技术面试

算法题解/数据结构/设计模式

我的生活趣事

个人公众号:后端技术漫谈

个人公众号:后端技术漫谈

如果文章对你有帮助,不妨点赞,收藏起来~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxfxj.html