FastJSON、Gson、Jackson(簡單了解使用)


 

下載地址(maven)

  Jackson:http://mvnrepository.com/search?q=jackson

  FastJson:http://mvnrepository.com/search?q=FastJson

  Gson:http://mvnrepository.com/search?q=Gson

下載教程(已gson為例):

簡單了解

一、Jackson

 1、簡介:

 Jackson可以輕松的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象。

2、解析原理:

  基於事件驅動,與GSON相同,先創建一個對應於JSON數據的JavaBean類就可以通過簡單的操作解析出所需JSON數據。但和Gson解析不同的是,GSON可按需解析,即創建的JavaBean類不一定完全涵蓋所要解析的JSON數據,按需創建屬性,但Jackson解析對應的JavaBean必須把Json數據里面的所有key都有所對應,即必須把JSON內的數據所有解析出來,無法按需解析。但Jackson的解析速度和效率都要比GSON高   

3、優勢

1、解析效率最高 

2、在數據量大的情況優勢尤為明顯、占存少

4、缺點

必須完全解析文檔,如果要按需解析的話可以拆分Json來讀取,操作和解析方法復雜;

5、推薦使用情景

適用於需要處理超大型JSON文檔、不需要對JSON文檔進行按需解析、、性能要求較高的場合

6、代碼:

 public static void main(String[] args) {
        System.out.println(toJson(new user(1,"張三","男",new Date())));
    }
    public static String toJson(Object obj){
        String re=null;
        //對象映射
        ObjectMapper objectMapper=new ObjectMapper();
        //設置時間格式
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objectMapper.setDateFormat(dateFormat);
        try {
            re=objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return re;
    }

 

  user代碼

package com;

import java.util.Date;

public class user {
    int id;
    String name;
    String sex;
    Date birthday;

    public user(int id, String name, String sex, Date birthday) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.birthday = birthday;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public user() {
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public user(int id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
}
View Code

運行結果

 

二、Gson

1、簡介:

 Google提供的用來java對象和JSON數據之間進行映射的JAVA類庫,可以將一個JSON字符轉成一個java對象,反過來也OK。

2、解析原理:

 

3、優勢

1、快速,高效 
2、代碼量少 
3、面向對象 
4、數據傳輸解析方便 

4、注意事項

1、內部嵌套的類必須是static的,要不然解析會出錯; 
2、類里面的屬性名必須跟Json字段里面的Key是一模一樣的; 
3、內部嵌套的用[]括起來的部分是一個List,所以定義為 public List< B> b,而只用{}嵌套的就定義為 public C c,是不是很簡單,而且現在android studio上可以直接用插件生成實體類,那更加方便了

5、代碼

public static void main(String[] args) {
        System.out.println(toJson(new user(1, "張三", "男", new Date())));
    }
    public static String toJson(Object obj){
        String re=null;
            Gson gson=new Gson();
        re= gson.toJson(obj);
        return  re;
    }
//反序列化 gson.formJson()
// List<String> ls = gson.fromJson(aaa,new TypeToken<List<String>>(){}.getType());

 user代碼在上面

三、FastJson 

1、簡介:

FastJson是阿里巴巴公司提供的一個用Java語言編寫的高性能功能完善的JSON庫,該庫涉及的最基本功能就是序列化和反序列化。Fastjson支持java bean的直接序列化,同時也支持集合、Map、日期、Enum和泛型等的序列化。你可以使用com.alibaba.fastjson.JSON這個類進行序列化和反序列化,常用的序列化操作都可以在JSON類上的靜態方法直接完成。Fastjson采用獨創的算法,將parse的速度提升到極致,號稱超過所有Json庫。而且,使用Fastjson解析時,除了需要使用Fastjson所提供的jar包外,再不需要額外的jar包,就能夠直接跑在JDK上。

2、解析原理:

  基於事件驅動,與GSON相同,先創建一個對應於JSON數據的JavaBean類就可以通過簡單的操作解析出所需JSON數據。但和Gson解析不同的是,GSON可按需解析,即創建的JavaBean類不一定完全涵蓋所要解析的JSON數據,按需創建屬性,但Jackson解析對應的JavaBean必須把Json數據里面的所有key都有所對應,即必須把JSON內的數據所有解析出來,無法按需解析。但Jackson的解析速度和效率都要比GSON高   

3、優勢

1、快速FAST(比任何一款都快) 
2、面向對象 
3、功能強大(支持普通JDK類任意java bean Class,Collection,Map,Date或者enum) 
4、零依賴(只需要有JDK即可) 
5、支持注解,全類型序列化

4、代碼

import com.alibaba.fastjson.JSON;

import java.util.Date;

public class faskjson {
    public static void main(String[] args) {
        System.out.println(JSON.toJSONString(new user(1, "張三", "男", new Date())));
    }

}

 

 user代碼在上面

運行結果

上面介紹了Jackson、Gson、FastJson的基本內容,細心的朋友可能發現介紹Gson與FastJson時我並未提及他們的缺點,並不是說這2個框架沒有缺點,只是相對與其他的框架他們的缺點並不突出。

上面特別介紹了Jackson的缺點,以及推薦了它使用的場景,那么其他場景下還是不建議大家使用,這點對於開發者來說其實也是需要考慮的一個問題,如果該庫的API使用難度大,或者很復雜,那么不建議使用,畢竟JSON解析的性能差異並不大。

FastJSON、Gson和Jackson性能對比

JSON序列化(Object => JSON)

測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本Java對象保存在文件中。每個類庫測試3次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速,取3次測試中最好的平均速度作為最終的測試數據。

類庫 樣本數量 執行次數 最長時間(毫秒) 最短時間(毫秒) 平均時間(毫秒)
FastJSON 100000 10 2291.22 1416.70 1454.93
Jackson 100000 10 1980.92 841.91 880.82
Gson 100000 10 2383.02 1469.08 1520.38

 從測試數據可知,FastJSON和GsonJSON序列化的速度差不多,Jackson是最快的(用時Gson少大約600毫秒)。

JSON反序列化(JSON => Object)

測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本JSON對象保存在文件中。每個類庫測試3次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速,取3次測試中最好的平均速度作為最終的測試數據。

類庫 樣本數量 執行次數 最長時間(毫秒) 最短時間(毫秒) 平均時間(毫秒)
FastJSON 100000 10 7942.31 6340.55 6526.41
Jackson 100000 10 7957.22 6623.85 6815.41
Gson 100000 10 8235.15 7006.06 7364.75

 從測試數據可知,三個類庫在反序列化上性能比較接近,Gson稍微差一些。

總結

把Java對象JSON序列化,Jackson速度最快,在測試中比Gson快接近50%,FastJSON和Gson速度接近。 
把JSON反序列化成Java對象,FastJSON、Jackson速度接近,Gson速度稍慢,不過差距很小。

 

包和項目地址:https://github.com/weibanggang/tojson

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM