下載地址(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; } }
運行結果
二、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速度稍慢,不過差距很小。