⑴ 废弃fastjson!大型项目迁移至Gson保姆级攻略
为何要放弃fastjson?
fastjson频繁暴露安全漏洞,导致公司内部需要频繁升级版本,以防止安全问题。相比之下,Gson和Jackson漏洞数量少,高危漏洞也较少,这是公司替换框架的主要原因。
性能对比
Fastjson在序列化单对象时速度最快,但Gson在序列化大对象时性能优势明显。Jackson在序列化大Json对象时性能最好。
使用Gson替换Fastjson
这里总结了两种json框架常用的方法,帮助快速上手Gson,无缝切换!
常见问题排雷
总结
文章主要为需要将项目迁移到Gson框架的同学准备。文章中提到了迁移框架的必要性评估,包括框架兼容性、性能差异和迁移耗费的工时等问题。希望对读者有所帮助。
参考
⑵ 问题复盘|在使用 gson 时,数字被自动转为 double 类型
在使用Gson进行数据转换时,遇到数字自动转为double类型的问题。将一个JsonObject转换为Map后,数字全部变为double形式,年龄2变为2.0,身高98.2正常显示,但登记时间显示为1.694533284627E12。面对此问题,我首先尝试通过搜索引擎寻找解决方案。发现Gson默认将number类型数据解析为double类型,并指出此问题在版本2.8.9中已修复。我查看自己使用的Gson版本为2.8.6,低于2.8.9,且存在相同问题。问题定位后,解决方法较为直接:升级Gson版本至2.8.9,并在创建Gson对象时手动设置数字类型转换策略。完成这些步骤后,问题得到解决。总结,此问题并非首次出现,也难以避免再次发生,简单记录,等待有缘人参考。
⑶ Gson,FastJson,org.JSON到底哪一个效率更高,速度更快
FastJson效率最高,是阿里巴巴开源 的Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson;
功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在Java SE 5.0以上版本;支持Android;
⑷ 渐进式实现Gson(1) - toJson
近期,我对小傅哥的Spring和Mybatis系列教程产生了浓厚的兴趣,特别是他解析大型项目的技巧,这激发了我对编程的热情。为了提升自己,我决定从Gson源码开始学习。
为何选择Gson?
我使用IDEA创建了一个新的Maven项目,并配置了pom.xml,以便进行单元测试和日志记录。
基础类型
首先,我从简单的基础类型开始,包括整数、字符串和布尔类型。
Gson的使用第一步是创建实例,将类转换为JSON字符串。这里涉及到toJson方法的设计。
toJson方法有几个同名版本,通常只需传递对象。最终调用的toJson方法是不返回值的,而我们所调用的toJson方法返回字符串。这表明结果存储在StringWriter对象中。
JsonWriter是基于Writer接口进行封装的,负责基本的JSON字符串写入操作。
为什么最后要由TypeAdapter来写?因为JsonWriter只负责基本操作,不同类有不同的处理方式。因此,定义抽象类TypeAdapter来提取类的共同逻辑,然后由具体类实现写入方法。
为什么Gson这里要用列表存储,而不是哈希表?虽然哈希表在获取效率上更高,但列表在这里更合适。
TypeAdapter实现
TypeAdapter使用工厂模式创建,因为它会受到Gson配置的影响。这与myBatis的SqlSessionFactory和SqlSession类似。用户不是直接调用SqlSession连接数据库,而是根据SqlSessionFactory收集的配置来创建SqlSession。最后,补充JsonWriter的方法。
这里没有太多难点,除了字符串处理,需要考虑特殊符号的情况。
最后,进行测试。
数组
同样,先写单元测试。
与基础类型相比,数组的处理更为复杂。
JsonWriter需要考虑作用域,增加相关逻辑。
创建栈数组,默认先添加空文件状态。如果之后写入值,则通过beforeValue和replaceTop来修改状态。如果是数组,则写入开括号,添加空数组状态,增加值则修改有非空。每次添加值,就加逗号,直到数组写入结束,加上关括号。
进行测试。
POJO类
终于到了POJO类的情况。
在Gson中添加相应的TypeAdapter。
与之前相比,POJO的处理要复杂得多。看一下工厂类的create方法。
它是处理继承Object的类,结合之前处理整数和布尔值的情况,就能明白为什么Gson类要用列表存储TypeAdapterFactory,因为要处理的类和TypeAdapter之间不是一一对应的关系。例如,之前处理整数和布尔值时,不仅要考虑int和boolean,还要考虑Integer和Boolean包装类,需要用同一的TypeAdapter处理,但后者又是继承Object,所以处理对象与TypeAdapter是多对一的关系,因此不能用哈希表处理。这一点也体现出工业级工具库与Demo的不同,前者的主要流程代码不一定多,但需要考虑大量的细节,应对不同的边界条件。
接着的逻辑没什么,就是取出POJO类的field信息,封装,然后用JsonWriter写入。至于为什么代码看起来比较复杂,因为源码要考虑对象不少复杂情况,如jvm内部、泛型处理等。
最后增加JsonWriter的逻辑。
进行测试。
源码:gitee.com/Dominguito/sm...
切换至toJson分支查看。