前言 随着REST API的流行,json(JavaScript Object Notation)作为一种轻量级的数据交互格式,具备易于人阅读与编写同时易于机器生存与解析等特点,逐渐得到广泛的应用。与此同时,json库反序列化特性导致的远程代码执行漏洞层出不穷,破坏力十足且影响面广泛。本文将从Gson、Jackson和Fastjson这三个主流JSON库的性能、安全等方面进行对比分析,供大家参考、取舍。 JSON介绍JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等 主流JSON库目前主流JSON库包括以下三个:GSON、JACKSON、FASTJSON GSON: Google公司发布的一个开源Java 库,主要用途为序列化Java对象为JSON字符串、反序列化JSON字符串成Java对象。Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法 JACKSON: Jackson是一款知名的JSON库,不仅支持流式处理json,还支持数据绑定,实现JSON字符串和Java对象的相互转换。Spring Boot默认自带jackson,也可以通过配置来修改。Jackson核心模块由三部分组成: 1. jackson-core:核心包,提供基于流模式解析的相关API,包括JsonPaser和JsonGenerator。 2. jackson-annotations:注解包,提供标准注解功能。 3. jackson-databind:数据绑定包,实现了对象和JSON之间的转换,这个包依赖上面两个包 FASTJSON: Fastjson是Alibaba开源的一款高性能JSON库。采用“假定有序快速匹配”的算法,号称Java语言中最快的JSON库。Fastjson接口简单易用,广泛应用在缓存序列化、协议交互、Web输出、Android客户端等场景。Fastjson提供两个主要接口toJsonString和parseObject来分别实现序列化和反序列化 性能分析Fastjson官方性能对比: 当处理数据量较小时gson的性能优势明显,样本数较大值fastjson明显领先,Jackson性能与fastjson大体相当
建议:综合分析,总结如下 性能:处理数据较小时建议选用gson,数据量较大时:Jackson与fastjson性能相当,建议选择jackson 安全性:gson风险最小,Jackson历史漏洞较多,但漏洞通报机制较好,其不存在全局的机制性问题,安全风险可控。Fastjson漏洞通报机制很差,且从架构上存在全局性机制问题,不建议使用。 |