比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裡面。而且這個類可以重複使用,所以一般會建立這個類的一個單例模式,比如下面的程式碼
- package com.example.jsondemo;
- import org.codehaus.jackson.map.ObjectMapper;
- /**
- *
- * @ClassName: com.example.jsondemo.JacksonMapper
- * @Description:ObjectMapper的單例模式
- * @author zhaokaiqiang
- * @date 2014-11-27 下午4:06:52
- *
- */
- publicclass JacksonMapper {
-
private
- private JacksonMapper() {
- }
- publicstatic ObjectMapper getInstance() {
- return mapper;
- }
- }
我們在下面的程式碼中,我們經常使用這個單例模式,大家不要迷惑。
1.簡單物件的Json資料生成
這裡所說的簡單物件指的是單一物件或者是物件的集合類。
下面我們先看程式碼實現,然後講解一些細節。
實現的方法有兩種,先看第一種,如下:
- <span style="font-size:18px;">public String getJsonString(Object object) throws Exception {
- return JacksonMapper.getInstance().writeValueAsString(object);
- }</span>
除此之外,我們還可以使用第二種方法,程式碼如下
- public String getJsonString1(Object object) throws Exception {
- ObjectMapper mapper = JacksonMapper.getInstance();
- StringWriter sw = new StringWriter();
- JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);
- mapper.writeValue(gen, object);
- gen.flush();
- gen.close();
- return sw.toString();
- }
這裡再多說一句,從第二種方法的方式裡,我們可以看到操作非常像Java裡面的IO流的處理,實際上,Jackson確實是以流的方式對資料進行處理的,這也是它處理速度這麼快的原因所在。
因為第一種方法更加的簡潔,所以推薦大家使用。
下面是測試程式碼和測試結果
- /**
- * 集合物件
- *
- * @throws Exception
- */
- publicvoid objectsToJson() throws Exception {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- ArrayList<Person> persons = new ArrayList<Person>();
- persons.add(p);
- persons.add(p);
- persons.add(p);
- Log.d(TAG, getJsonString(persons));
- }
- /**
- * 單一物件
- *
- * @throws Exception
- */
- publicvoid objectToJson() throws Exception {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- Log.d(TAG, getJsonString(p));
- }
測試結果如下
- <span style="font-size:18px;">{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}
- </span>
- <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格式
我們先直接看下面的程式碼吧!
- /**
- * 生成Object形式的json
- *
- * @throws Exception
- */
- publicvoid createObjectJson() throws Exception {
- Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
- StringWriter stringWriter = new StringWriter();
- // 必須通過這種方式獲取
- JsonGenerator jsonGenerator = JacksonMapper.getInstance()
- .getJsonFactory().createJsonGenerator(stringWriter);
- jsonGenerator.writeStartObject();
- jsonGenerator.writeStringField("name", "zhaokaiqiang");
- jsonGenerator.writeNumberField("age", 22);
- jsonGenerator.writeObjectField("person", p);
- jsonGenerator.writeEndObject();
- jsonGenerator.flush();
- jsonGenerator.close();
- Log.d(TAG, stringWriter.toString());
- }