天天看點

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