本文仅作客观比较fastjson与jackson的性能测试,部分测试代码引自http://www.oschina.net/code/snippet_1156226_26432#44097 文中的方法,但是纠正了对于jackson的使用方式(需要写成单例先初始化,不要每次都new)。分别测试序列化1000,1万与10万次数据所花费的时间。
当然在此,如果大家发现文中的使用错误,也希望随时指出来帮助大家将优化做的更好。
测试代码均使用最新的jar包,而具体版本如下:
Jackson 2.x:
(这里仅测试Jackson2.x因为和1.x相比还是有些变化的,从包名就可以发现2.x变成com.fasterxml.jackson而不是1.x的org.codehaus.jackson希望大家注意区分)
jackson-annotations-2.4.1.jar
jackson-core-2.4.1.jar
jackson-databind-2.4.1.jar
fastjson
fastjson-1.1.41.jar
======================================================
------------------------------------以下为测试结果------------------------------
======================================================
预置条件1:循环1000次。
============序列化===========
序列化生成数据所用时间(秒):0.12
序列化Jackson所用时间(秒):0.077
序列化fastjson所用时间(秒):0.07
===========反序列化===========
反序列化生成数据所用时间(秒):0.095
反序列化Jackson所用时间(秒):0.114
反序列化fastjson所用时间(秒):0.149
-------------------------------------------------------------------------------------
预置条件2:循环10000次。
============序列化===========
序列化生成数据所用时间(秒):0.289
序列化Jackson所用时间(秒):0.281
序列化fastjson所用时间(秒):0.277
===========反序列化===========
反序列化生成数据所用时间(秒):0.344
反序列化Jackson所用时间(秒):0.416
反序列化fastjson所用时间(秒):0.445
-------------------------------------------------------------------------------------
预置条件3:循环100000次。
============序列化===========
序列化生成数据所用时间(秒):1.99
序列化Jackson所用时间(秒):0.855
序列化fastjson所用时间(秒):1.774
===========反序列化===========
反序列化生成数据所用时间(秒):2.69
反序列化Jackson所用时间(秒):1.33
反序列化fastjson所用时间(秒):1.606
以上对于10万条数据的测试可以看出jackson2.x在序列化上确实显现出了一些优势。
以下附代码(并附件打包):
/** * 主测试类 */ package com.test; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonProcessingException; /** * * @author guoyongxiang * Date: 2014-8-20 */ public class JsonParseTest { public static void main(String[] args) throws IOException { System.out.println("============序列化==========="); Monitoring.begin(); List<Corp> list = new ArrayList<Corp>(); for (int i = 0; i < 100000; i++) { list.add(fullObject(Corp.class)); } Monitoring.end("序列化生成数据"); // 排除首次初始化差异 JacksonMapper.toJson(list.get(0)); Monitoring.begin(); jacksonSerialize(list); Monitoring.end("序列化Jackson"); // 排除首次初始化差异 JSON.toJSONString(list.get(0)); Monitoring.begin(); fastjsonSerialize(list); Monitoring.end("序列化fastjson"); System.out.println("===========反序列化==========="); List<String> jsonStrList = new ArrayList<String>(); for (Corp corp : list) { String str = JacksonMapper.toJson(corp); jsonStrList.add(str); } Monitoring.end("反序列化生成数据"); // 排除首次初始化差异 JacksonMapper.toObj(jsonStrList.get(0), Corp.class); Monitoring.begin(); jacksonUnSerialize(jsonStrList); Monitoring.end("反序列化Jackson"); // 排除首次初始化差异 JSON.parseObject(jsonStrList.get(0), Corp.class); Monitoring.begin(); fastjsonUnSerialize(jsonStrList); Monitoring.end("反序列化fastjson"); } // ---------------------------------序列化--------------------------------- public static void jacksonSerialize(List<Corp> list) throws JsonProcessingException { for (Corp corp : list) { String str = JacksonMapper.toJson(corp); } } public static void fastjsonSerialize(List<Corp> list) { for (Corp corp : list) { String str = JSON.toJSONString(corp); } } // ---------------------------------反序列化--------------------------------- public static void jacksonUnSerialize(List<String> list) throws IOException { for (String json : list) { Corp corp = JacksonMapper.toObj(json, Corp.class); } } public static void fastjsonUnSerialize(List<String> list) { for (String json : list) { Corp corp = JSON.parseObject(json, Corp.class); } } /** * 填充一个对象(一般用于测试) */ public static <T> T fullObject(Class<T> cl) { T t = null; try { t = cl.newInstance(); Method methods[] = cl.getMethods(); for (Method method : methods) { // 如果是set方法,进行随机数据的填充 if (method.getName().indexOf("set") == 0) { Class<?> param = method.getParameterTypes()[0]; if (param.equals(String.class)) { method.invoke(t, getRandomString(5)); } else if (param.equals(Short.class)) { method.invoke(t, (short) new Random().nextInt(5)); } else if (param.equals(Float.class)) { method.invoke(t, new Random().nextFloat()); } else if (param.equals(Double.class)) { method.invoke(t, new Random().nextDouble()); } else if (param.equals(Integer.class)) { method.invoke(t, new Random().nextInt(10)); } else if (param.equals(Long.class)) { method.invoke(t, new Random().nextLong()); } else if (param.equals(Date.class)) { method.invoke(t, new Date()); } else if (param.equals(Timestamp.class)) { method.invoke(t, new Timestamp(System.currentTimeMillis())); } else if (param.equals(java.sql.Date.class)) { method.invoke(t, new java.sql.Date(System.currentTimeMillis())); } } } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return t; } public static String getRandomString(int length) { //length表示生成字符串的长度 String base = "abcdefghijklmnopqrstuvwxyz0123456789"; //生成字符串从此序列中取 Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { int number = random.nextInt(base.length()); sb.append(base.charAt(number)); } return sb.toString(); } }
计时器:
/** * */ package com.test; /** * 计时器 * @author guoyongxiang * Date: 2014-8-20 */ public class Monitoring { private static ThreadLocal<Long> begin = new ThreadLocal<Long>(); public static void begin() { begin.set(System.currentTimeMillis()); } public static void end(String name) { double time = (System.currentTimeMillis() - begin.get()) / 1000.0; System.out.println(name + "所用时间(秒):" + time); } }
测试对象
/** * */ package com.test; import java.sql.Timestamp; /** * 对象 * @author guoyongxiang * Date: 2014-8-20 */ public class Corp { private Long uid; private Integer corpGrade; private Integer cityId; private String name; private String EName; private String description; private String zipCode; private String tel; private String fax; private String EMail; private Integer isEmailOpen; private Integer EMailChecked; private Timestamp regDateOnGov; private String backroll; private String address; private String webStoreUrl; private Integer isNew; private Integer credit; private Integer activeDegrees; private Integer hits; private Integer isHitsRecord; private Timestamp regTimeOnZfa; private Integer corpType; private Integer corpMajorcategoryId; private Integer businessRoleId; private String keyword; private Integer developState; private String isAlert; private Integer advMemState; private Integer advStockState; private Integer allianceState; private Timestamp lastUpdateTime; private Integer corpMajorcategoryId1; private String keyword1; private Long certificatePic; private Integer isUpdateCharter; private Integer currcount; private Integer curronsale; private Integer curronhot; private Integer currniccount; private Integer currniconsale; private Integer currniconhot; private String buyProducts; private Integer isOpenShop; private Integer state; private String mainProduct; private String advBrandIds; private String feature; private Integer category; private Integer contactFlag; private String fastPassage; // 省略getter/setter }
jackson 工具类(默认设置,过多设置会降低效率而且很明显,如识别json中的单引号等)
package com.test; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * JacksonMapper * * @author guoyongxiang */ public class JacksonMapper { private static final ObjectMapper mapper = new ObjectMapper(); private JacksonMapper() { } public static ObjectMapper getInstance() { return mapper; } /** * Object to Json String * * @param obj * @return * @throws JsonProcessingException */ public static String toJson(Object obj) throws JsonProcessingException { ObjectMapper mapper = JacksonMapper.getInstance(); //SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); //mapper.setDateFormat(df); return mapper.writeValueAsString(obj); } /** * Json to List * * @param <T> * @param json * @param clazz * @return * @throws IOException * @throws JsonMappingException * @throws JsonParseException */ public static <T> List<T> toList(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException { ObjectMapper mapper = JacksonMapper.getInstance(); //mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); //mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); List<T> list = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz)); return list; } /** * Json String to Object<br> * String json = "..."; ObjectMapper mapper = JacksonMapper.getInstance();<br> * YourBean bean = mapper.readValue(json, new YourBean().getClass()); * * @param json * @param clazz * @return * @throws IOException * @throws JsonMappingException * @throws JsonParseException */ public static <T> T toObj(String json, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{ ObjectMapper mapper = JacksonMapper.getInstance(); //mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); //mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); return mapper.readValue(json, clazz); } /** * JsonNode to Object * @param node * @param clazz * @return * @throws JsonParseException * @throws JsonMappingException * @throws IOException */ public static <T> T toObj(JsonNode node, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException{ ObjectMapper mapper = JacksonMapper.getInstance(); return mapper.readValue(node.toString(), clazz); } /** * Json String to JsonNode * @param json * @return * @throws JsonProcessingException * @throws IOException */ public static JsonNode toNode(String json) throws JsonProcessingException, IOException{ ObjectMapper mapper = JacksonMapper.getInstance(); return mapper.readTree(json); } /** * Object to JsonNode * @param obj * @return * @throws JsonProcessingException * @throws IOException */ public static JsonNode toNode(Object obj) throws JsonProcessingException, IOException{ String json = toJson(obj); return toNode(json); } }
相关推荐
在选择使用Fastjson还是Jackson时,需要根据项目的需求和特点来决定,例如性能敏感的应用可以选择Fastjson,而需要高级功能和灵活性的项目可能更适合Jackson。同时,确保使用与项目兼容且安全的库版本。
本文将从性能、功能、易用性和社区支持四个方面比较 fastjson、jackson 和 gson,帮助读者更好地选择合适的 JSON解析器。 性能 fastjson 是阿里出品的 JSON 解析器,具有高性能和低内存占用的特点。fastjson 使用...
Fastjson提供了简单直观的API,使得JSON与Java对象之间的转换变得异常简便。此外,它还支持JSON到Java对象的映射,以及JSON到XML的转换,适合于大量数据处理和性能敏感的应用场景。 3. Jackson: Jackson是另一个...
主要针对常用的json工具Gson,jackson,fastjson进行性能测试,一个完整的工程,包含测试类、测试结论,以及三个工具包的jar文件。可以直接在eclipse中运行。具体版本如下: fastjson-1.1.28.jar gson-1.7.1.jar ...
在Java开发中,有三个流行的JSON库:Gson、Fastjson和Jackson,它们提供了方便快捷的方式来序列化和反序列化Java对象为JSON字符串。 **Gson库** Gson是由Google开发的库,它的主要功能是将Java对象转换为JSON字符...
在Java世界里,为了方便地处理JSON数据,有三个主流的库被广泛应用,即Fastjson、Gson和Jackson。这些库提供了JSON的序列化和反序列化功能,将Java对象转换为JSON字符串,以及将JSON字符串转换回Java对象。 1. **...
FastJson通常在性能方面优于Jackson,特别是在处理大量数据时,其解析速度更快。然而,这并不意味着在所有情况下都是如此,具体性能取决于JSON的结构和应用的需求。 4. **灵活性与兼容性** Jackson以其广泛的...
然而,值得注意的是,尽管FastJsonJar在性能上表现出色,但在某些特定场景下可能不如其他库如Gson或Jackson稳定,因此在实际使用时,应根据项目需求和具体场景选择合适的JSON库。 总的来说,FastJsonJar作为一款...
Fastjson以其高性能著称,而Jackson则以其全面的功能和灵活性受到青睐。它们都支持将Java对象转换为JSON字符串,反之亦然,且提供了丰富的API和配置选项。同时,这个压缩包中包含的不同版本的库可能意味着它是为了...
相比于Gson、Jackson等其他流行的JSON库,Fastjson在性能上占有一定优势,尤其是在大数据量处理时。同时,由于其API设计简洁,学习成本相对较低,使得它成为许多Java开发者首选的JSON库。 总结,Fastjson-1.2.35....
主流JSON引擎性能比较(GSON,FASTJSON,JACKSON,JSONSMART) 前言 测试目的: Purpose 测试当前主流Json引擎的序列化与反序列化性能,包括JSON,FASTJSON,JACKSON and SMARTJSON。 Test the performance of the ...
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器 来自阿里巴巴的工程师开发 主要特点: 快速FAST 比其它任何基于Java的解析器和生成器更快 包括jackson) 强大(支持普通JDK类包括任意Java Bean ...
与其他如Jackson、Gson等Java JSON库相比,Fastjson在速度上有优势,且API设计更符合中国开发者习惯,对于处理中文字符的支持也更为友好。然而,每个库都有其适用场景,选择时应结合项目需求进行评估。 五、集成与...
1. **高性能**:Fastjson在解析和生成JSON的过程中,采用了高效的算法,使得速度远超同类库,如Jackson、Gson等。 2. **简单易用**:API设计简洁,支持多种数据类型与JSON对象之间的相互转换,使得开发人员能够快速...
性能极致,性能远超过其他流行JSON库,包括jackson/gson/org.json支持JDK新特性,包括JDK 11/JDK 17,针对compact string优化,支持Record,支持GraalVM Native-Image。完善的JSONPath支持,支持SQL:2016的JSONPath...
Fastjson的性能优势显著,经过一系列基准测试,它在速度上超越了同类的Java JSON库,如Jackson、Gson等。这得益于其高效的算法设计和对Java虚拟机特性的深度利用。Fastjson的性能优化不仅体现在处理大规模数据时的...
Fastjson是一个Java语言编写的高性能功能完善的JSON库。 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocol buf。
在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与ProtoBuf相关的`proto.exe`工具。 1. Gson(Google Gson): Gson是由Google提供的Java库,用于将Java对象转换为...