Android JSON解析庫的使用

今天跟大家分享一下關於Android中常用的JSON解析的第三方庫的使用,在我們平時的開發中,如果根據JSON數據的格式一步一步的手動去解析,不僅工作量較大而且效率也比較低,所以我們很多時候都是去採用一些第三方的庫,這裏面封裝好了各種方法供我們使用,比較常用的是GSON和Fast-json。

首先我們來看一下什麼是JSON?

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

其次我們再來了解一下GSON:GSON是Google官方提供的用來在Java對象和JSON數據之間進行映射的Java類庫,可以講一個JSON字符串轉換成一個Java對象,也可以反過來講一個Java對象轉換成一個JSON字符串。特點是快速高效,代碼簡潔,面向對象,數據傳遞和解析方便。

最後來了解一下Fast-json:Fast-json是阿里巴巴集團研發的一個性能很好的由Java語言實現的JSON解析器和生成器,具有極快的性能(據說是全球最快的),特點是快速(比其它任何基於Java的解析器和生成器更快,包括jackson),功能強大(支持普通JDK類包括任意JavaBeanClass、Collection、Map、Date或enum),零依賴(除了JDK之外,沒有依賴任何其它類庫),支持註解、支持全類型序列化。

好了,瞭解了以上這些知識點之後,我們一起來看一下它們的具體使用方法,這裏我是根據網上的一個視頻裏面的教程做的一個案例,裏面用到的接口是豆瓣上的(接口地址貼在這裏:https://api.douban.com/v2/book/1220562),相關的jar包大家可以自己去網上下載,然後給自己的項目中添加一下依賴就OK了,接口返回的json格式的數據如下:

 

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

在這裏我們只取其中的幾個字段做說明即可,在我們的項目中創建相關的實體類,首先創建一個Tag.java,這裏取的是接口裏面的"tags"這個字段,代碼如下:

 

 

package com.jarchie.jsonparserproject.bean;

/**
 * Created by Jarchie on 17/1/4.
 * 創建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;
    }
}

 

然後再來創建一個Book.java的實體類,因爲用法都一樣,所以在這裏只取接口裏的4個字段做個簡單說明:

 

package com.jarchie.jsonparserproject.bean;

import java.util.ArrayList;

/**
 * Created by Jarchie on 17/1/4.
 * 創建Book的實體
 */

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;
    }
}

好了實體類創建完了之後,開始到項目中具體的去解析數據吧。

 

(一)、Gson用法:1.定義實體類;2.根據需要可以將JSON生成單個實體或列表實體集合

第一步操作,已經完成了,直接來看第二步操作,如果我們將Json生成單個實體,我們需要這樣寫:

 

Gson gson = new Gson();
Book book = gson.fromJson(responseString,Book.class);

這裏的responseString就是我們根據接口從網絡上獲取到的json格式的字符串。如果我們需要生成實體集合,我們可以這樣寫:

 

 

Type listType = new TypeToken<ArrayList<Book>>(){}.getType();
ArrayList<Book> books = gson.fromJson(responseString,listType);

這裏給出具體實現的源碼:

 

 

package com.jarchie.jsonparserproject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jarchie.jsonparserproject.bean.Book;
import java.lang.reflect.Type;
import java.util.ArrayList;

/**
 * @author Jarchie
 * @version 2017/01/04
 * 創建Gson解析的案例
 */
public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    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();
    }

    /**
     * 採用Google提供的Volley這個網絡框架進行網絡數據的請求
     */
    private void getData() {
        StringRequest request = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String responseString) {
                Log.i(TAG, "onResponse: " + responseString);
                parserData(responseString);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        new Volley().newRequestQueue(getApplicationContext()).add(request);
    }

    /**
     * Gson解析的具體使用
     * @param responseString
     */
    private void parserData(String responseString) {
        Gson gson = new Gson();
        Book book = gson.fromJson(responseString,Book.class);
        Log.e(TAG, "parserData: " + book.getTitle() + ":" +
            book.getPublisher() + ":" + book.getTags().size());
//        Type listType = new TypeToken<ArrayList<Book>>(){}.getType();
//        ArrayList<Book> books = gson.fromJson(responseString,listType);
    }

}

 

(二)、Fast-json用法:1.定義實體類;2.根據需要可以將JSON生成單個實體或列表實體集合

同樣的第一步已經完成了,直接來看第二步操作,將json生成單個實體,我們可以這樣寫:

 

Book book = JSON.parseObject(responseString,Book.class);

大家看,一句話就搞定了,是不是比我們用原生的解析方便多了。如果我們要將json轉成實體集合,我們可以這樣寫:

 

 

List<Book> list = JSON.parseObject(responseString,new TypeReference<List<Book>>(){});

這裏我們還可以反向操作,如果我們想要將實體轉成JSON數據,我們可以這樣寫:

 

 

Book book1 = new Book();
book1.setTitle("測試1");
JSON.toJSON(book1);

我們想要將集合轉成JSON數據,我們可以這樣寫:

 

 

List<Book> lists = new ArrayList<>();
lists.add(book1);
JSON.toJSON(lists);

這裏給出源碼,供大家參考:

 

 

package com.jarchie.jsonparserproject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.jarchie.jsonparserproject.bean.Book;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Jarchie
 * @version 2017/01/04
 * 創建fast-json的案例
 */
public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    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 Response.Listener<String>() {
            @Override
            public void onResponse(String responseString) {
                Log.i(TAG, "onResponse: " + responseString);
                parserData(responseString);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        Volley.newRequestQueue(getApplicationContext()).add(request);
    }

    /**
     * 解析數據
     * @param responseString
     */
    private void parserData(String responseString) {
        Book book = JSON.parseObject(responseString,Book.class);
        Log.e(TAG, "parserData: " + book.getTitle() + ":"
        +book.getPublisher()+":"+book.getTags().size());

//        List<Book> list = JSON.parseObject(responseString,new TypeReference<List<Book>>(){});
//
//        Book book1 = new Book();
//        book1.setTitle("測試1");
//        JSON.toJSON(book1);
//
//        List<Book> lists = new ArrayList<>();
//        lists.add(book1);
//        JSON.toJSON(lists);
    }

}

因爲現在我們大家都使用AndroidStudio進行開發了,在AS裏面有一個非常優秀的插件可以讓我們快速生成實體類,我們只需要定義好一個類即可,裏面的內容可以爲我們自動生成,我們可以自行的去AS中搜索下載。

 

使用的時候我們只要在Bean類裏面右鍵-->Generate-->GsonFormat,然後將json數據放進去,回車後選擇自己需要的字段即可自動生成,非常方便。

好了,今天就分享這麼多,謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章