[b]json序列化工具性能对比[/b]
[b]fastjson[/b]
1.fastjson是阿里做的国有开源Java工具包
2.FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
[b]jackson[/b]
1.Jackson是一个数据处理的工具套件,它的亮点是流式的JSON解析器及生成器。它是专为Java设计的,同时也能处理其它非JSON的编码。
2.从我们在Github中的统计来看,它应该是最流行的JSON解析器。
3.Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
4.Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
[b]JSON.simple[/b]
JSON.simple是一个JSON编解码的Java工具库。它旨在打造一个轻量简单且高性能的工具库。
[b]GSON[/b]
1.Google的GSON
2.GSON这个Java库能够在Java对象和JSON间进行相互转换。
3.Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
[b]JSONP[/b]
1.Oracle的JSONP
2.JSONP (JSON Processing)是JSON处理的一套Java API,从名字来看它就是用来生成及解析JSON串的。这是JSR353规范的一个开源实现。
[b]总结[/b]
1.如果你的应用经常会处理大的JSON文件(190MB),那么Jackson应该是你的菜。GSON在大文件上表现得相当吃力。
2.如果你主要是处理小文件(1K)请求,比如某个微服务或者分布式架构的初始化,那么GSON当是首选。Jackson在小文件上的表现则不如人意。
3.如果这两种文件你都经常会处理到,那么在两轮表现中都位居第二的JSON.simple对此类场景则更为适合。在不同的文件大小上Jackson和GSON的表现都不太好。
4.如果只是功能要求,没有性能要求,可以使用google的Gson
5.如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
6.GSON如果不是每次产生新对象时,是最快的
结论:
1.在做了初始化的情况下GSON的速度都是最快的。
2.在使用GSON或jackJson做Json处理时最好有个全局的解析对象,不要每次调用的时候都去生成那样对性能的影响很大,另外经过测试,这里面没有线程安全问题。
3.fastJson在json转化为对象的应用场景下性能比较突出
[b]实测对比:[/b]
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
package com.cesmart;
import java.util.List;
class Demo {
private String cmd;
private String content;
private List<User> userList;
public static class User{
private int age;
private String name;
private int year;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
[b]每次新建对象:[/b]
package com.cesmart;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cesmart.Demo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
public class Application {
private static long count = 100;
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long gsonTime = gson();
System.gc();
long jackJsonTime = jackJson();
System.gc();
long fastJsonTime = fastJson();
System.gc();
System.out.println("---------------------------------------------------------------");
long gsonTime2 = gsonJson();
System.gc();
long jackJsonTime2 = jackJsonJson();
System.gc();
long fastJsonTime2 = fastJsonJson();
System.out.println("---------------------------------------------------------------");
System.out.println("object to json: " + "gsonTime == " + gsonTime);
System.out.println("object to json: " + "jackJsonTime == " + jackJsonTime);
System.out.println("object to json: " + "fastJsonTime == " + fastJsonTime);
System.out.println("---------------------------------------------------------------");
System.out.println("json to object: " + "gsonTime == " + gsonTime2);
System.out.println("json to object: " + "jackJsonTime == " + jackJsonTime2);
System.out.println("json to object: " + "fastJsonTime == " + fastJsonTime2);
}
private static Demo getDemo(int i) {
Demo demo = new Demo();
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setAge(i);
user1.setName("name");
user1.setYear(i);
User user2 = new User();
user2.setAge(i + 2);
user2.setName("name");
user2.setYear(i + 2);
User user3 = new User();
user3.setAge(i + 3);
user3.setName("name");
user3.setYear(i + 3);
userList.add(user1);
userList.add(user2);
userList.add(user3);
demo.setCmd("1");
demo.setContent("dd");
demo.setUserList(userList);
return demo;
}
private static long gson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
Gson gson = new Gson();
String StringJson = gson.toJson(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long jackJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
ObjectMapper objectMapper = new ObjectMapper();
String StringJson = objectMapper.writeValueAsString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long fastJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
// JSONObject jsonObject = new JSONObject();
String StringJson = JSON.toJSONString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long gsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Gson gson = new Gson();
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
gson.fromJson(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long jackJsonJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
ObjectMapper objectMapper = new ObjectMapper();
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
objectMapper.readValue(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long fastJsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
JSON.parseObject(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
}
[b]输出结果:[/b]
[img]http://dl2.iteye.com/upload/attachment/0121/3789/097cb84b-9f63-3951-800e-8dc9a5ba706c.png[/img]
[b]初始化时新建对象:[/b]
package com.cesmart;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cesmart.Demo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
public class Application2 {
private static ObjectMapper objectMapper = new ObjectMapper();
private static Gson gson = new Gson();
private static JSONObject jsonObject = new JSONObject();
private static long count = 100;
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long gsonTime = gson();
System.gc();
long jackJsonTime = jackJson();
System.gc();
long fastJsonTime = fastJson();
System.gc();
System.out.println("---------------------------------------------------------------");
long gsonTime2 = gsonJson();
System.gc();
long jackJsonTime2 = jackJsonJson();
System.gc();
long fastJsonTime2 = fastJsonJson();
System.out.println("---------------------------------------------------------------");
System.out.println("object to json: " + "gsonTime == " + gsonTime);
System.out.println("object to json: " + "jackJsonTime == " + jackJsonTime);
System.out.println("object to json: " + "fastJsonTime == " + fastJsonTime);
System.out.println("---------------------------------------------------------------");
System.out.println("json to object: " + "gsonTime == " + gsonTime2);
System.out.println("json to object: " + "jackJsonTime == " + jackJsonTime2);
System.out.println("json to object: " + "fastJsonTime == " + fastJsonTime2);
}
private static Demo getDemo(int i) {
Demo demo = new Demo();
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setAge(i);
user1.setName("name");
user1.setYear(i);
User user2 = new User();
user2.setAge(i + 2);
user2.setName("name");
user2.setYear(i + 2);
User user3 = new User();
user3.setAge(i + 3);
user3.setName("name");
user3.setYear(i + 3);
userList.add(user1);
userList.add(user2);
userList.add(user3);
demo.setCmd("1");
demo.setContent("dd");
demo.setUserList(userList);
return demo;
}
private static long gson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = gson.toJson(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long jackJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = objectMapper.writeValueAsString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long fastJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long gsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
gson.fromJson(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long jackJsonJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
objectMapper.readValue(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
private static long fastJsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
JSON.parseObject(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}
}
输出结果:
[img]http://dl2.iteye.com/upload/attachment/0121/3791/cc049690-0f72-3d75-abd7-d9b4a5cb6ebd.png[/img]