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/%E5%B7%A5%E4%BD%9C/%E7%A8%8B%E5%BA%8F%E5%91%98/javaSE/FastJson%E8%BF%81%E7%A7%BB%E8%87%B3Jackson/
《你真的会用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
推荐阅读
- 为啥阿里巴巴不建议MySQL使用Text类型?
- 淘宝直播三大核心技术揭秘
- 揭秘阿里巴巴的客群画像
- 阿里认证的证书有哪些 阿里巴巴企业认证怎么认证
- 阿里巴巴认证不通过是什么原因 阿里云认证证书有用吗
- 淘宝开店怎么发货 阿里巴巴铺货到淘宝店铺怎么发货
- 淘宝生意参谋怎么看同行转化率 阿里巴巴生意参谋怎么看同行数据
- 淘宝进货渠道除了阿里巴巴还有什么 淘宝的进货渠道
- 淘宝店铺关联代码在哪里找 阿里巴巴店铺关联快递的代码在哪
- 在阿里巴巴一件代发怎么发货 阿里巴巴怎么一件代发货
