Android JSON:Gson,FastJson解析庫的使用和對比分析

一、概述

目前主流數據交換格式就是 Json和Xml,而 Json 格式使用範圍可能更加的廣並且可拓展性更強一些。
本文章將對 Json 數據交換格式通過 Gson 和 FastJson 來實現在 Android 端的高效解析。

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,用於數據轉換傳輸。
通用於PHP, Java, C++, C#, Python等編程語言數據交換傳輸。
易於人閱讀和編寫,同時也易於機器解析和生成。
基本結構:對象、數組。

  1. Gson 的簡介和特點:
    Gson 是 Google 提供的用來在 Java 對象和 JSON 數據之間進行映射的 Java 類庫。
    可以將一個 JSON 字符串轉成一個 Java 對象,或者反過來。
    • 快速、高效
    • 代碼量少、簡潔
    • 面向對象
    • 數據傳遞和解析方便

    • 基本用法:
      • 定義實體類
      • 根據需要可以將JSON 生成單個實體或列表實體集合
    • 代碼演示:
      使用 Gson 解析 JsonObject
      使用 Gson 解析 JsonArray
      使用 Gson 將實體轉爲JSON 數據
  2. FastJson 簡介和特點:
    FastJson 是一個性能很好的 Java 語言實現的 JSON 解析器和生成器,來自阿里巴巴的工程師開發。
    具有極快的性能,超越任其他的Java Json parser。
    • 快速FAST (比其它任何基於Java的解析器和生成器更快,包括jackson)
    • 強大(支持普通JDK類包括任意Java Bean Class、 Collection、 Map、 Date或enum )
    • 零依賴(沒有依賴其它任何類庫除了JDK)
    • 支持註解、支持全類型序列化

    • 基本用法:
      • 定義實體類
      • 根據需要可以將JSON 生成單個實體或列表實體集合
    • 代碼演示:
      使用 FastJson 解析 JsonObject
      使用 FastJson 解析 JsonArray
      使用 FastJson 將實體轉爲JSON 數據

二、實例解析

1. Gson的基本用法

Gson有兩個重要的方法,一個是 tojson(),另一個是 fromjson()

  • tojson() :將bean裏面的內容轉換爲json內容。
User user=new User("zhangsan",19);

Gson gson=new Gson();
System.out.println(gson.toJson(user));

//打印結果是{"name":"zhangsan","age":19}

當然它還可以承擔一些複雜的操作,比如通過集合插入一組數據。

  List<User> list = new LinkedList<User>();
  User u1 =new User("zhangsan",19);
  list.add(u1);
  User u2=new User("lisi",25);
  list.add(u2);
  Gson gson = new Gson();
  System.out.println(gson.toJson(list));

  //打印結果是[{"name":"zhangsan","age":19},{"name":"lisi","age":25}]

  //注意,對於Json而言,[]代表數組,{}代表一個對象

當然它還可以實現更復雜的對象,比如在一個Json對象中再嵌套一個Json對象。

  • fromjson() :從我們的Json對象封裝出一個一個的bean對象。
     User u = new User();
     Gson gson = new Gson();
     u = gson.fromJson("{name:'zhangsan',age:12}", user.class);

     System.out.println(u.getName()+"      "+u.getAge());

     //打印結果是zhangsan   12

如果你的Json裏面不止一個對象,那麼你就得使用一個集合來裝.
我們這裏模擬一個list來裝的例子,在使用list裝的過程中我們會使用到一個工具類 TypeToken .
通過它我們可以 獲取一個泛型的數據類型,使用方法十分簡單,TypeToken<泛型>(){}.gettype()即可,返回一個Type類型,這就是fromjson()所需要的type類型,來自於reflect包

  User user = new User();
  Gson gson = new Gson();
  String str = "[{name:'zhangsan',age:12},{name:'lisi',age:13}]";
  // 獲取一個泛型的數據類型
  Type type = new TypeToken<List<user>>(){}.getType();
  List<user> list = gson.fromJson(str , type);
  for(user u : list){
      System.out.println(u.getName() + "      " + u.getAge());
  }

  //打印結果是zhangsan 12
  //lisi 13

2. Gson的實例解析

下面這段 json 代碼(時間不一樣獲得的代碼可能不一樣)是豆瓣書籍的一個 api :
https://api.douban.com/v2/book/1220562

{
    "rating": {
        "max": 10, 
        "numRaters": 345, 
        "average": "7.0", 
        "min": 0
    }, 
    "subtitle": "", 
    "author": [
        "[日] 片山恭一"
    ], 
    "pubdate": "2005-1", 
    "tags": [
        {
            "count": 133, 
            "name": "片山恭一", 
            "title": "片山恭一"
        }, 
        {
            "count": 62, 
            "name": "日本", 
            "title": "日本"
        }, 
        {
            "count": 60, 
            "name": "日本文學", 
            "title": "日本文學"
        }, 
        {
            "count": 38, 
            "name": "小說", 
            "title": "小說"
        }, 
        {
            "count": 32, 
            "name": "滿月之夜白鯨現", 
            "title": "滿月之夜白鯨現"
        }, 
        {
            "count": 15, 
            "name": "愛情", 
            "title": "愛情"
        }, 
        {
            "count": 8, 
            "name": "純愛", 
            "title": "純愛"
        }, 
        {
            "count": 8, 
            "name": "外國文學", 
            "title": "外國文學"
        }
    ], 
    "origin_title": "", 
    "image": "https://img1.doubanio.com/mpic/s1747553.jpg", 
    "binding": "平裝", 
    "translator": [
        "豫人"
    ], 
    "catalog": "
      ", 
    "pages": "180", 
    "images": {
        "small": "https://img1.doubanio.com/spic/s1747553.jpg", 
        "large": "https://img1.doubanio.com/lpic/s1747553.jpg", 
        "medium": "https://img1.doubanio.com/mpic/s1747553.jpg"
    }, 
    "alt": "http://book.douban.com/subject/1220562/", 
    "id": "1220562", 
    "publisher": "青島出版社", 
    "isbn10": "7543632608", 
    "isbn13": "9787543632608", 
    "title": "滿月之夜白鯨現", 
    "url": "http://api.douban.com/v2/book/1220562", 
    "alt_title": "", 
    "author_intro": "", 
    "summary": "那一年,是聽莫扎特、釣鱸魚和家庭破裂的一年。說到家庭破裂,母親怪自己當初沒有找到好男人,父親則認爲當時是被狐狸精迷住了眼,失常的是母親,但出問題的是父親……。", 
    "price": "15.00元"
}

下面我們在Android進行解析。
Project中總共有三個類:MainActivity.java , Book.java , Tag.java

public class MainActivity extends Activity {
    private String url = "https://api.douban.com/v2/book/1220562";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getData();
    }

    private void getData() {
        StringRequest request = new StringRequest(url, new Listener<String>() {

            @Override
            public void onResponse(String arg0) {
                Log.i("info", arg0);
                dealData(arg0);
            }

        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError arg0) {
                // TODO Auto-generated method stub
            }
        });
        // 將請求加入隊列
        new Volley().newRequestQueue(getApplicationContext()).add(request);
    }

    private void dealData(String result) {
        Gson gson = new Gson();
        Book book = gson.fromJson(result, Book.class);
        Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"
                + book.getTags().size()); // 這裏打印了tags的個數
    }
}

// Log日誌結果是  滿月之夜白鯨現:青島出版社:8
// 對象的變量名要與json中的相對應,這裏只是選取了json中的幾個“變量”進行解析
public class Book {

    private String title;
    private String publisher;
    private String summary;
    private ArrayList<Tag> tags;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public ArrayList<Tag> getTags() {
        return tags;
    }

    public void setTags(ArrayList<Tag> tags) {
        this.tags = tags;
    }

}
public class Tag {

    private String count;
    private String name;
    private String title;

    public String getCount() {
        return count;
    }

    public void setCount(String count) {
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

3. FastJson的基本用法

1) Fastjson中的經常調用的方法
  // 把JSON文本parse爲JSONObject或者JSONArray 
  public static final Object parse(String text); 

  // 把JSON文本parse成JSONObject    
  public static final JSONObject parseObject(String text);

  // 把JSON文本parse爲JavaBean 
  public static final  T parseObject(String text, Class clazz); 

  // 把JSON文本parse成JSONArray
  public static final JSONArray parseArray(String text);  

  //把JSON文本parse成JavaBean集合 
  public static final  List parseArray(String text, Class clazz); 

  // 將JavaBean序列化爲JSON文本
  public static final String toJSONString(Object object); 

  // 將JavaBean序列化爲帶格式的JSON文本 
  public static final String toJSONString(Object object, boolean prettyFormat); 

  // 將JavaBean轉換爲JSONObject或者JSONArray。
  public static final Object toJSON(Object javaObject); 

2) 如何使用FastJson

  • 服務器端使用Fastjson將數據轉換成json字符串
    主要使用的函數如下:
public static String createJsonString(Object value)
{
    String alibabaJson = JSON.toJSONString(value);//此處轉換
    return alibabaJson;
}
  • 客戶端將從服務器端獲取到的json字符串轉換爲相應的javaBean,
    下面給以寫核心的函數例子,供參考:
    public static String getJsonContent(String urlStr) {
        try {  
            // 獲取HttpURLConnection連接對象
            URL url = new URL(urlStr);
            HttpURLConnection httpConn = (HttpURLConnection) url
                    .openConnection();
            // 設置連接屬性
            httpConn.setConnectTimeout(3000);
            httpConn.setDoInput(true);
            httpConn.setRequestMethod("GET");
            // 獲取相應碼
            int respCode = httpConn.getResponseCode();
            if (respCode == 200) {
                return ConvertStream2Json(httpConn.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    private static String ConvertStream2Json(InputStream inputStream) throws IOException {
        String jsonStr = "";
        // ByteArrayOutputStream相當於內存輸出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        // 將輸入流轉移到內存輸出流中
        while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
            out.write(buffer, 0, len);
        }
        // 將內存流轉換爲字符串
        jsonStr = new String(out.toByteArray());
        return jsonStr;
    }

3) 使用泛型獲取javaBean(核心函數)

  public static T getPerson(String jsonString, Class cls) {
     T t = null;
     t = JSON.parseObject(jsonString, cls);
     return t;
  }

  public static List getPersons(String jsonString, Class cls) {
     List list = new ArrayList();
     list = JSON.parseArray(jsonString, cls);
     return list;
  }

4. FastJson的實例解析

只需在“Gson的實例解析中”修改dealData(String result)方法即可。

    private void dealData(String result) {
        Book book = JSON.parseObject(result, Book.class);
        List<Book> books = JSON.parseObject(result,
                new TypeReference<List<Book>>() {
                });
        Book book1 = new Book();
        book1.setTitle("biaoti");
        Book book2 = new Book();
        book2.setTitle("biaoti");
        Book book3 = new Book();
        book2.setTitle("biaoti");

        List<Book> list = new ArrayList<Book>();
        list.add(book1);
        list.add(book2);
        list.add(book3);
        JSON.toJSON(list);
        Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":"
                + book.getTags().size());
    }

三、Gson的知識點補充

1. toJson()方法

toJson()方法用於將Java對象轉換爲相應的JSON數據,主要有以下幾種形式:

  (1)String toJson(JsonElement jsonElement);
  (2)String toJson(Object src);
  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用於將JsonElement對象(可以是JsonObject、JsonArray等)轉換成JSON數據;
  方法(2)用於將指定的Object對象序列化成相應的JSON數據;
  方法(3)用於將指定的Object對象(可以包括泛型類型)序列化成相應的JSON數據。

2. fromJson()方法

fromJson()方法用於將JSON數據轉換爲相應的Java對象,主要有以下幾種形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);
  (2)<T> T fromJson(JsonElement json, Type typeOfT);
  (3)<T> T fromJson(JsonReader reader, Type typeOfT);
  (4)<T> T fromJson(Reader reader, Class<T> classOfT);
  (5)<T> T fromJson(Reader reader, Type typeOfT);
  (6)<T> T fromJson(String json, Class<T> classOfT);
  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用於將不同形式的JSON數據解析成Java對象。

發佈了62 篇原創文章 · 獲贊 54 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章