1. 程式人生 > >比Gson解析速度快10倍!——Json解析神器Jackson使用介紹

比Gson解析速度快10倍!——Json解析神器Jackson使用介紹

    在前面的兩篇文章中,我們介紹了Json資料格式和系統自帶Json以及Google的Gson專案,如果能學會這些東西,基本能滿足工作需求了。但是,程式設計師都有追求極致效率的嗜好,在滿足了基本需求之後,我們會考慮能不能再優化一下效率呢?當然!今天這篇文章要介紹的,就是在資料量比較大的時候,比Gson的解析效率高近10倍的Json資料解析框架— —Jackson!

    

    我們從上圖可以看出,在大資料量的情況下,Jackson的速度比Gson的解析速度快了不是一點半點,所以,最推薦大家使用的就是Jackson框架,來,咱們一起看看怎麼用!

   我們先介紹一下常用的幾個類的功能:

JsonFactory:這個類是Jackson專案主要的工廠方法,主要用於配置和構建解析器(比如 JsonParser)和生成器(比如 JsonGenerator),這個工廠例項是執行緒安全的,如果有配置的話,可以重複使用。

JsonGenerator:這個類主要是用來生成Json格式的內容的,我們可以使用JsonFactory的方法生成一個例項。

JsonParser:這個主要是用來讀取Json格式的內容,並且完成解析操作的,我們可以使用JsonFactory的方法生成一個例項。

ObjectMapper:這個類提供了Java物件和Json之間的轉化,主要通過JsonParser和JsonGenerator例項來完成實際的對Json資料的讀寫操作。這個類是ObjectCodec的子類,主要的實現細節都在ObjectCodec裡面。而且這個類可以重複使用,所以一般會建立這個類的一個單例模式,比如下面的程式碼

  1. package com.example.jsondemo;  
  2. import org.codehaus.jackson.map.ObjectMapper;  
  3. /** 
  4.  *  
  5.  * @ClassName: com.example.jsondemo.JacksonMapper 
  6.  * @Description:ObjectMapper的單例模式 
  7.  * @author zhaokaiqiang 
  8.  * @date 2014-11-27 下午4:06:52 
  9.  *  
  10.  */
  11. publicclass JacksonMapper {  
  12.     private
    staticfinal ObjectMapper mapper = new ObjectMapper();  
  13.     private JacksonMapper() {  
  14.     }  
  15.     publicstatic ObjectMapper getInstance() {  
  16.         return mapper;  
  17.     }  
  18. }  

    我們在下面的程式碼中,我們經常使用這個單例模式,大家不要迷惑。

1.簡單物件的Json資料生成

   這裡所說的簡單物件指的是單一物件或者是物件的集合類。

    下面我們先看程式碼實現,然後講解一些細節。

    實現的方法有兩種,先看第一種,如下:

  1. <span style="font-size:18px;">public String getJsonString(Object object) throws Exception {  
  2.     return JacksonMapper.getInstance().writeValueAsString(object);  
  3. }</span>  
    在這種方法中,我們直接使用ObjectMapper類的writeValueAsString(),就可以把物件的json格式作為返回值直接返回。

    除此之外,我們還可以使用第二種方法,程式碼如下

  1. public String getJsonString1(Object object) throws Exception {  
  2.         ObjectMapper mapper = JacksonMapper.getInstance();  
  3.         StringWriter sw = new StringWriter();  
  4.         JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);  
  5.         mapper.writeValue(gen, object);  
  6.         gen.flush();  
  7.         gen.close();  
  8.         return sw.toString();  
  9.     }  
    這種方法是使用JsonGenerator和StringWriter物件,通過ObjectMapper,把轉換好的Json資料寫到了StringWriter裡面,然後toString()就可以拿到我們需要的Json資料了。

    這裡再多說一句,從第二種方法的方式裡,我們可以看到操作非常像Java裡面的IO流的處理,實際上,Jackson確實是以流的方式對資料進行處理的,這也是它處理速度這麼快的原因所在。

    因為第一種方法更加的簡潔,所以推薦大家使用。

    下面是測試程式碼和測試結果

  1. /** 
  2.      * 集合物件 
  3.      *  
  4.      * @throws Exception 
  5.      */
  6.     publicvoid objectsToJson() throws Exception {  
  7.         Person p = new Person("zhaokaiqiang"22new Birthday(1992119));  
  8.         ArrayList<Person> persons = new ArrayList<Person>();  
  9.         persons.add(p);  
  10.         persons.add(p);  
  11.         persons.add(p);  
  12.         Log.d(TAG, getJsonString(persons));  
  13.     }  
  14.     /** 
  15.      * 單一物件 
  16.      *  
  17.      * @throws Exception 
  18.      */
  19.     publicvoid objectToJson() throws Exception {  
  20.         Person p = new Person("zhaokaiqiang"22new Birthday(1992119));  
  21.         Log.d(TAG, getJsonString(p));  
  22.     }  

測試結果如下
  1. <span style="font-size:18px;">{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}  
  2. </span>  
  1. <span style="font-size:18px;">[{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}]</span>  

2.複雜物件的Json資料的生成

    這裡所說的複雜物件指的是由多種不同資料型別的資料組成的資料,下面我們將介紹如何建立這種複雜物件的Json資料。

   我們在前面介紹過,Json格式分為Object形式和Array形式,我們將分別介紹這兩種格式如何生成。

    (1)Object格式

    我們先直接看下面的程式碼吧!

  1. /** 
  2.      * 生成Object形式的json 
  3.      *  
  4.      * @throws Exception 
  5.      */
  6.     publicvoid createObjectJson() throws Exception {  
  7.         Person p = new Person("zhaokaiqiang"22new Birthday(1992119));  
  8.         StringWriter stringWriter = new StringWriter();  
  9.         // 必須通過這種方式獲取
  10.         JsonGenerator jsonGenerator = JacksonMapper.getInstance()  
  11.                 .getJsonFactory().createJsonGenerator(stringWriter);  
  12.         jsonGenerator.writeStartObject();  
  13.         jsonGenerator.writeStringField("name""zhaokaiqiang");  
  14.         jsonGenerator.writeNumberField("age"22);  
  15.         jsonGenerator.writeObjectField("person", p);  
  16.         jsonGenerator.writeEndObject();  
  17.         jsonGenerator.flush();  
  18.         jsonGenerator.close();  
  19.         Log.d(TAG, stringWriter.toString());  
  20.     }  
    JsonGenerator是一個生成器,如果我們想建立複雜的Json物件,我們就可以是用這個類來完成。但是有一點必須要注意,就是獲取J