FastJson、Gson、Jackson json解析性能比较
我们之前的项目中一直使用的Jackson API解析记录日志,后面随着数据量的增加,系统运行越来越慢,特别是一些查询接口,达到了不能忍受的地方。经过分析发现,罪魁祸首就是在记录日志的过程中的json解析,因为当时项目非常紧急,所以就直接放弃这种json解析记录日志的方式,也没有找相关的替代方案,最近几天项目没有那么忙了,就想起了这事,所以就研究了下各种json解析方案,主要是大家常用的三个:FastJson、Gson以及我们之前项目中用到的Jackson;
直接上代码
FastJson实现
package haha.json;
import com.alibaba.fastjson.JSON;
public classFastJsonTest {
/**
* 把javabean转化为json字符串
* */
publicstaticString beanToJson(Object objBean) {
return JSON.toJSONString(objBean);
}
}
Jackson实现
package haha.json;
import java.io.IOException;
import java.io.StringWriter;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public classJacksonTest {
/**
* 把javabean转化为json字符串
* */
publicstaticString beanToJson(Object objBean) {
String jsonStr = "";
ObjectMapper objectMapper = new ObjectMapper();
StringWriter stringWriter = new StringWriter();
JsonGenerator jsonGenerator;
try {
jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(stringWriter);
objectMapper.writeValue(jsonGenerator, objBean);
jsonStr = stringWriter.toString();
if (null != jsonGenerator) {
jsonGenerator.flush();
}
if (null != stringWriter) {
stringWriter.flush();
}
if (null != jsonGenerator) {
jsonGenerator.close();
}
jsonGenerator = null;
objectMapper = null;
} catch (IOException e) {
}
return jsonStr;
}
}
Gson实现
package haha.json;
import com.google.gson.Gson;
public classGsonTest {
publicstaticString BeanToString(Object obj) {
Gson gson = new Gson();
return gson.toJson(obj);
}
}
测试VO类
package haha.json;
import java.math.BigDecimal;
import java.util.Date;
public class JsonBeanVO {
private int id;
private String name;
private String desc;
private String remark;
private Date createTime;
private Date endTime;
private BigDecimal price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc){
this.desc = desc;
}
public String getRemark() {
return remark;
}
public void setRemark(Stringremark) {
this.remark = remark;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(DatecreateTime) {
this.createTime =createTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(DateendTime) {
this.endTime = endTime;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimalprice) {
this.price = price;
}
}
测试代码
package haha.json;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public classTest {
publicstaticvoidmain(String []args){
JsonBeanVO vo=new JsonBeanVO();
vo.setId(11);
vo.setName("hahhah");
vo.setDesc("hehehe");
vo.setRemark("remark");
vo.setPrice(new BigDecimal("1.1314"));
vo.setCreateTime(new Date());
vo.setEndTime(new Date());
List
for (int i = 0; i < 10; i++) {
list.add(vo);
}
Long fastJsonStart=System.currentTimeMillis();
FastJsonTest.beanToJson(list);
System.out.println("fastJson Time:"+(System.currentTimeMillis()-fastJsonStart));
Long jacksonStart=System.currentTimeMillis();
JacksonTest.beanToJson(list);
System.out.println("Jackson Time:"+(System.currentTimeMillis()-jacksonStart));
Long gsonStart =System.currentTimeMillis();
GsonTest.BeanToString(list);
System.out.println("Gson Time:"+(System.currentTimeMillis()-gsonStart));
}
}
测试结果
1,当数组的大小为10时:
2,当数组的大小为100时:
3,当数组的大小为1000时:
5,当数组的大小为100000时:
6,当数组的大小为1000000时:
7,当数组的大小为10000000时:FastJson能正常解析,Jackson和Gson直接内存溢出了(注:本人电脑内存比较小,4G的)
通过以上测试数据得出结论:
1, 不管是哪种json解析方式,效率都说不上高,所以尽可能少用;
2, 在数据量很小的时候,Gson效率最高,但随着数据量的增加,效率下降也最快;
3, FastJson在大数据量方面相对表现最好,从小数据量到数据量增加效率上也比其它两个更高。
所以如果项目一定要用到json解析的话,综合考量应选择FastJson,当然最好能根据数据量选择Gson或者FastJson