天天看点

FastJson、Gson、Jackson json解析性能比较

FastJson、Gson、Jackson  json解析性能比较

我们之前的项目中一直使用的Jackson API解析记录日志,后面随着数据量的增加,系统运行越来越慢,特别是一些查询接口,达到了不能忍受的地方。经过分析发现,罪魁祸首就是在记录日志的过程中的json解析,因为当时项目非常紧急,所以就直接放弃这种json解析记录日志的方式,也没有找相关的替代方案,最近几天项目没有那么忙了,就想起了这事,所以就研究了下各种json解析方案,主要是大家常用的三个:FastJson、Gson以及我们之前项目中用到的Jackson;

直接上代码

FastJson实现

package haha.json;

import com.alibaba.fastjson.JSON;

public classFastJsonTest {

   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 {

   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<JsonBeanVO> list=newArrayList<JsonBeanVO>(10);

        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时:

FastJson、Gson、Jackson json解析性能比较

2,当数组的大小为100时:

FastJson、Gson、Jackson json解析性能比较

3,当数组的大小为1000时:

FastJson、Gson、Jackson json解析性能比较

4,当数组的大小为1

FastJson、Gson、Jackson json解析性能比较

0000时:

5,当数组的大小为100000时:

FastJson、Gson、Jackson json解析性能比较

6,当数组的大小为1000000时:

FastJson、Gson、Jackson json解析性能比较

7,当数组的大小为10000000时:FastJson能正常解析,Jackson和Gson直接内存溢出了(注:本人电脑内存比较小,4G的)

FastJson、Gson、Jackson json解析性能比较

通过以上测试数据得出结论:

1,    不管是哪种json解析方式,效率都说不上高,所以尽可能少用;

2,    在数据量很小的时候,Gson效率最高,但随着数据量的增加,效率下降也最快;

3,    FastJson在大数据量方面相对表现最好,从小数据量到数据量增加效率上也比其它两个更高。

所以如果项目一定要用到json解析的话,综合考量应选择FastJson,当然最好能根据数据量选择Gson或者FastJson