选择一个合适的JSON库要从多个方面进行考虑:
- 字符串解析成JSON性能
- 字符串解析成JavaBean性能
- JavaBean构造JSON性能
- 集合构造JSON性能
- 易用性
常用的4个JSON类库分别:
- Gson
目前功能最全的Json解析神器,由Google研发
主要为toJson
与fromJson
两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上 - FastJson
Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。
在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库 - Jackson
是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。
Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。 - Json-lib
最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷, 比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。
添加maven依赖
<!-- Json libs--> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <!-- Gson--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> <!-- Fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.46</version> </dependency> <!-- jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.4</version> </dependency>
四个库的工具类
- FastJsonUtil.java
public class FastJsonUtil { public static String bean2Json(Object obj) { return JSON.toJSONString(obj); } public static <T> T json2Bean(String jsonStr, Class<T> objClass) { return JSON.parseObject(jsonStr, objClass); } }
- GsonUtil.java
public class GsonUtil { private static Gson gson = new GsonBuilder().create(); public static String bean2Json(Object obj) { return gson.toJson(obj); } public static <T> T json2Bean(String jsonStr, Class<T> objClass) { return gson.fromJson(jsonStr, objClass); } public static String jsonFormatter(String uglyJsonStr) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(uglyJsonStr); return gson.toJson(je); } }
- JacksonUtil.java
public class JacksonUtil { private static ObjectMapper mapper = new ObjectMapper(); public static String bean2Json(Object obj) { try { return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { e.printStackTrace(); return null; } } public static <T> T json2Bean(String jsonStr, Class<T> objClass) { try { return mapper.readValue(jsonStr, objClass); } catch (IOException e) { e.printStackTrace(); return null; } } }
- JsonLibUtil.java
public class JsonLibUtil { public static String bean2Json(Object obj) { JSONObject jsonObject = JSONObject.fromObject(obj); return jsonObject.toString(); } @SuppressWarnings("unchecked") public static <T> T json2Bean(String jsonStr, Class<T> objClass) { return (T) JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass); } }
从上面的测试结果可以看出,序列化次数比较小的时候,Gson性能最好,当不断增加的时候到了100000,Gson明细弱于Jackson和FastJson, 这时候FastJson性能是真的牛,另外还可以看到不管数量少还是多,Jackson一直表现优异。而那个Json-lib简直就是来搞笑的。
从上面的测试结果可以看出,反序列化的时候,Gson、Jackson和FastJson区别不大,性能都很优异,而那个Json-lib还是来继续搞笑的。