Gson、Fastjson和Jackson速度对比
Gson
- 依赖
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency>
- 工具类
private GsonUtil() {}private static Gson gson = null;static {gson = new Gson();}/*** 将object对象转成json字符串** @param object* @return*/public static String getGsonByObject(Object object) {String gsonString = null;if (gson != null) {gsonString = gson.toJson(object);}return gsonString;}/*** 将gsonString转成泛型bean** @param gsonString* @param cls* @return*/public static <T> T gsonToBean(String gsonString, Class<T> cls) {T t = null;if (gson != null) {t = gson.fromJson(gsonString, cls);}return t;}/*** 转成list* 泛型在编译期类型被擦除导致报错* @param gsonString* @param cls* @return*/public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {List<T> list = null;if (gson != null) {list = gson.fromJson(gsonString, new TypeToken<List<T>>() {}.getType());}return list;}/*** 转成list* 解决泛型问题* @param json* @param cls* @param <T>* @return*/public static <T> List<T> jsonToList(String json, Class<T> cls) {Gson gson = new Gson();List<T> list = new ArrayList<T>();JsonArray array = new JsonParser().parse(json).getAsJsonArray();for(final JsonElement elem : array){list.add(gson.fromJson(elem, cls));}return list;}/*** 转成list中有map的** @param gsonString* @return*/public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {List<Map<String, T>> list = null;if (gson != null) {list = gson.fromJson(gsonString,new TypeToken<List<Map<String, T>>>() {}.getType());}return list;}/*** 转成map的** @param gsonString* @return*/public static <T> Map<String, T> gsonToMaps(String gsonString) {Map<String, T> map = null;if (gson != null) {map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {}.getType());}return map;}
- 实体
@Data
public class UserDto {private Integer id;private String account;private String userName;private String idCard;private String Addr;
}
- 测试说明,程序封装200000个UserDto对象,测试10次。
- 序列化测试(Object转Json)
工具 | 次数 | 毫秒 |
---|---|---|
gson | 第1次 | 585 |
gson | 第2次 | 463 |
gson | 第3次 | 536 |
gson | 第4次 | 626 |
gson | 第5次 | 555 |
gson | 第6次 | 521 |
gson | 第7次 | 527 |
gson | 第8次 | 448 |
gson | 第9次 | 568 |
gson | 第10次 | 696 |
- 反序列化(Json转Object)
工具 | 次数 | 毫秒 |
---|---|---|
gson | 第1次 | 357 |
gson | 第2次 | 314 |
gson | 第3次 | 319 |
gson | 第4次 | 296 |
gson | 第5次 | 289 |
gson | 第6次 | 324 |
gson | 第7次 | 301 |
gson | 第8次 | 299 |
gson | 第9次 | 313 |
gson | 第10次 | 326 |
Fastjson
- 依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.29</version></dependency>
- 工具类
private FastJsonUtil() {}private static SerializerFeature[] feature = {//解决FastJson循环引用的问题SerializerFeature.DisableCircularReferenceDetect,//排序SerializerFeature.SortField};private static SerializeConfig mapping = new SerializeConfig();static {mapping.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));mapping.put(Timestamp.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));//数据库的一个时间类型}/*** 将对象转换成JSON字符串 --固定时间格式"yyyy-MM-dd HH:mm:ss"** @param BO/VO,map,数组,list 对象* @return JSON字符串* @说明:对bean中有Date类型的数据可以成功转换成yyyy-MM-dd HH:mm:ss格式的时间类型,例如:"barDate":yyyy-MM-dd HH:mm:ss*/public static String getJsonByObj(Object bean) {return getJsonByObj(bean, mapping);}/*** 将对象转换成JSON字符串 --特定时间格式--所有Key为小写** @param BO/VO,map,数组,list 对象* @return JSON字符串* @dateType 时间格式转换后的字符串格式,例如yyyy-MM-dd HH:mm:ss* @说明:对bean中有Date类型的数据可以成功转换成yyyy-MM-dd HH:mm:ss格式的时间类型,例如:"barDate":yyyy-MM-dd HH:mm:ss*/public static String getJsonByObj(Object bean, String dateType) {SerializeConfig zdymapping = new SerializeConfig();zdymapping.put(Date.class, new SimpleDateFormatSerializer(dateType));return getJsonByObj(bean, zdymapping);}/*** 将对象转换成JSON字符串 ---效率高一些--不处理key 也不处理循环引用的问题--也不处理时间格式** @param BO/VO,map,数组,list 对象* @return JSON字符串* @说明:对bean中有Date类型的数据可以成功转换成long格式的时间类型,例如:"barDate":1458268099098*/public static String getJsonDefaultByObj(Object bean) {return JSON.toJSONString(bean);}/*** 将JSON数据转换为ListBean集合** @param <T>* @param json JSON数组数据* @param calzz 待转换的Bean类型 --LinkedCaseInsensitiveMap* @return*/public static <T> List<T> getListBean(String json, Class<T> calzz) {return JSON.parseArray(json, calzz);}/*** 将JSON数据转换为List集合** @param <T>* @param json JSON数组数据* @param calzz 待转换的Bean类型 --LinkedCaseInsensitiveMap* @return*/@SuppressWarnings({"rawtypes", "unchecked"})public static List getList(String json, Class calzz) {return getListBean(json, calzz);}/*** 将JSON数据转换为 Java Bea n对象** @param json JSON字符串* @param calzz 待转换的Bean类型--LinkedCaseInsensitiveMap* @return*/public static <T> T getObjet(String json, Class<T> calzz) {return JSON.parseObject(json, calzz);}/**** 通用封装--获取json字符串* @param bean 对象* @param mappingx 时间类型计划等* @return*/private static String getJsonByObj(Object bean, SerializeConfig mappingx) {String json = JSON.toJSONString(bean, mappingx, feature);json = stringToJson(json);return json; //所有Key为小写}/*** 当文本中含有如下特殊字符时,此方法可以成功处理,让其在前台被正确解析,注意:此法不能处理单引号** @param s* @return*/public static String stringToJson(String s) {StringBuffer sb = new StringBuffer();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);switch (c) {/*case '\"':sb.append("\\\"");break;*/case '\\': //如果不处理单引号,可以释放此段代码,若结合下面的方法处理单引号就必须注释掉该段代码sb.append("\\\\");break;case '/':sb.append("\\/");break;case '\b': //退格sb.append("\\b");break;case '\f': //走纸换页sb.append("\\f");break;case '\n':sb.append("\\n"); //换行break;case '\r': //回车sb.append("\\r");break;case '\t': //横向跳格sb.append("\\t");break;default:sb.append(c);}}return sb.toString();}
- 实体
@Data
public class UserDto {private Integer id;private String account;private String userName;private String idCard;private String Addr;
}
- 测试说明,程序封装200000个UserDto对象,测试10次。
- 序列化测试(Object转Json)
工具 | 次数 | 毫秒 |
---|---|---|
fastjson | 第1次 | 651 |
fastjson | 第2次 | 673 |
fastjson | 第3次 | 632 |
fastjson | 第4次 | 660 |
fastjson | 第5次 | 669 |
fastjson | 第6次 | 697 |
fastjson | 第7次 | 719 |
fastjson | 第8次 | 817 |
fastjson | 第9次 | 669 |
fastjson | 第10次 | 709 |
- 反序列化测试(Json转Object)
工具 | 次数 | 毫秒 |
---|---|---|
fastjson | 第1次 | 143 |
fastjson | 第2次 | 140 |
fastjson | 第3次 | 140 |
fastjson | 第4次 | 158 |
fastjson | 第5次 | 161 |
fastjson | 第6次 | 159 |
fastjson | 第7次 | 155 |
fastjson | 第8次 | 158 |
fastjson | 第9次 | 179 |
fastjson | 第10次 | 157 |
Jackson
- 依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.6</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.6</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.6</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency>
- 工具类
private JacksonUtil() {}private static final ObjectMapper mObjectMapper = new ObjectMapper();private static final ObjectMapper mObjectMapperLowerCaseWithUnderScores = new ObjectMapper();//在这里进行配置全局static {//有时JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段(java 原始类型)没有在实体类中找到//设置为false即不抛出异常,并设置默认值 int->0 double->0.0mObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);mObjectMapperLowerCaseWithUnderScores.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//序列化时添加下划线mObjectMapperLowerCaseWithUnderScores.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy());}public static String beanToJson(Object object) {if (object != null) {try {return mObjectMapper.writeValueAsString(object);} catch (JsonProcessingException e) {System.out.println("bean to json exception");}}return "";}public static <T> T jsonToBean(String json, Class<T> classType) {if (StringUtils.isNotBlank(json) && classType != null) {try {return mObjectMapper.readValue(json, classType);} catch (IOException e) {System.out.println("json to bean exception");}}return null;}public static <T> List<T> jsonToList(String json, Class<T> classType) {if (StringUtils.isNotBlank(json) && classType != null) {try {return mObjectMapper.readValue(json, mObjectMapper.getTypeFactory().constructCollectionType(List.class, classType));} catch (IOException e) {System.out.println("json to list exception");}}return null;}public static <k, v> Map<k, v> jsonToMap(String json, Class<k> kType, Class<v> vType) {if (StringUtils.isNotBlank(json)) {try {return mObjectMapper.readValue(json, mObjectMapper.getTypeFactory().constructMapType(Map.class, kType, vType));} catch (IOException e) {System.out.println("json to Map exception");}}return null;}public static String beanToJsonByLowerCase(Object object) {if (object != null) {try {return mObjectMapperLowerCaseWithUnderScores.writeValueAsString(object);} catch (JsonProcessingException e) {System.out.println("bean to json with lowerCase exception");}}return "";}public static <T> T jsonToBeanByLowerCase(String json, Class<T> classType) {if (StringUtils.isNotBlank(json)) {try {return mObjectMapperLowerCaseWithUnderScores.readValue(json, classType);} catch (IOException e) {System.out.println("json to Bean with lowerCase exception");}}return null;}
- 实体
@Data
public class UserDto {private Integer id;private String account;private String userName;private String idCard;private String Addr;
}
- 测试说明,程序封装200000个UserDto对象,测试10次。
- 序列化测试(Object转Json)
工具 | 次数 | 毫秒 |
---|---|---|
jackson | 第1次 | 598 |
jackson | 第2次 | 533 |
jackson | 第3次 | 510 |
jackson | 第4次 | 558 |
jackson | 第5次 | 503 |
jackson | 第6次 | 507 |
jackson | 第7次 | 490 |
jackson | 第8次 | 503 |
jackson | 第9次 | 523 |
jackson | 第10次 | 527 |
- 反序列化测试(Json转Object)
工具 | 次数 | 毫秒 |
---|---|---|
jackson | 第1次 | 412 |
jackson | 第2次 | 374 |
jackson | 第3次 | 276 |
jackson | 第4次 | 316 |
jackson | 第5次 | 311 |
jackson | 第6次 | 311 |
jackson | 第7次 | 327 |
jackson | 第8次 | 318 |
jackson | 第9次 | 317 |
jackson | 第10次 | 304 |
小结
- 序列化比较结果(Object转Json)
工具 | 次数据 | 最快 | 最慢 | 平均 |
---|---|---|---|---|
gson | 10 | 468 | 696 | 552.5 |
fastjson | 10 | 632 | 817 | 689.6 |
jackson | 10 | 276 | 490 | 598 |
- 反序列化比较结果(Json转Object)
工具 | 次数据 | 最快 | 最慢 | 平均 |
---|---|---|---|---|
gson | 10 | 289 | 357 | 313.8 |
fastjson | 10 | 140 | 179 | 155 |
jackson | 10 | 276 | 412 | 326.6 |
- 结论
序列化,三个工具类都差不多;反序列化fastjson很出色。所以以后在项目中直接使用fastjson工具类即可。
Gson、Fastjson和Jackson速度对比相关推荐
- 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)
Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...
- 主流JSON引擎性能比较(GSON,FASTJSON,JACKSON,JSONSMART)
JsonPerformanceVS 主流JSON引擎性能比较(GSON,FASTJSON,JACKSON,JSONSMART) 文章目录 JsonPerformanceVS 前言 测试目的: Purp ...
- java byter是字节吗_GitHub - XXQAQ/Byter: 字节对象转换框架,一个基于字节的 Gson/FastJson...
Byter 字节对象转换框架,一个基于字节的 Gson/FastJson 众所周知,Json数据的序列化内容就是字符串,如果说Gson/FastJson是基于字符串的Json转化框架,那么Byter就 ...
- 记一次FastJSON和Jackson解析json时遇到的中括号问题
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jadyer/article/details/24395015 完整版见https://jadyer. ...
- Spring MVC--使用fastjson替换jackson来响应json数据
使用fastjson替换jackson来响应json数据. springmvc-config.xml <?xml version="1.0" encoding="U ...
- javabean与json转换(fastjson与jackson两个版本)
[README] 本文演示了 javabean与json转换的开发方式: 要想 javabean的属性名 与 json的字段名不一致,也是可以转换的: 之前需要引入 ali.fastjson < ...
- java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)
java中float.double和BigDecimal的精度问题(fastjson.Jackson以及实例化的方式): 问题描述 java中如果使用float或double类型的数据初始化BigDe ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- 对象 和 json 互转 四种方式 json-lib、Gson、FastJson、Jackson
文章目录 一. json-lib 二. Google的Gson 1.简介 2. 配置步骤 1. MAVEN 依赖引入 2. gsonUtil 工具类 3. 排除不要序列化的熟悉注解类 Exclude ...
最新文章
- 从难免的线上bug说起代码的思考
- python websocket 客户端_aiohttp Websocket客户端和HTTP
- python加载shellcode免杀 简介
- java properties更新_对Java配置文件Properties的读取、写入与更新操作
- j2me程序发布到手机
- python手枪_Python入门,爬虫训练——枪械查询
- C++设计模式-备忘录模式
- pandas 导入excel_三行Python代码,合并多个Excel文件
- JAVA IO - 高效读取大文件的后几行
- 监控视频中人的特征识别
- 23.docker export
- ubuntu环境下载android源码
- 攒机笔记十六:制作pe盘
- (七)练习:美萍酒店管理系统中系统设置的房间管理选项卡部分测试
- 如何将在ad里面添加元器件符号_请教怎么在AD10中的PCB中直接加入自己创建的封装库文件中的元件...
- Sugar BI数据可视化图表标注
- 火爆!GitHub 标星 144k 的前后端学习路线,2021 年最新整理,看完后不再迷茫不再徘徊
- win10下PHP开发环境搭建
- MinGW MinGW-W64介绍
- 云服务器系统分区,云服务器系统盘可以分区
热门文章
- Java锁定座位功能_自习室管理系统,基于B/S模式下的JAVA系统
- 怎么区分有限合伙人和普通合伙人
- 2021年起重机械指挥考试及起重机械指挥考试题库
- phalapi使用redis做MQ队列
- webservice框架 java_Java CXF WebService框架 开发入门案例
- TLB之flush操作[二]
- Xcode 安装Command Line Tools
- android 充电模式deamon_安兔兔公布6月Android手机性价比排行榜
- 音频1-基础知识(硬件,音频相关概念)
- UWB技术之物理层和测距方法接收