《Android》『JSON & GSON』- GSON 的基本程式語法教學 (下)
《Android Developers 參考文獻》
《簡單介紹》
延續上一篇的介紹,這篇我們將把上一篇的範例程式碼,改成以 GSON 的 API 來解析,比起 JSON 官方所提供的 API,當 Server 端與 Client 端都是以 Java 程式語言為基礎時(才能使用相同的已知類別),GSON 所提供的 API 可以用更加精簡的程式、更快的解析 JSON 格式的資料。
《GSON 之資料解析基本用法》
在使用 GSON 之前,我們必須先取得 GSON 的 jar 檔,直接上網搜尋下載,並加入專案之 libs 資料夾即可,下面我們直接以程式碼的方式,來說明 GSON 的使用方法。
1. 基本的 Json 與字串格式互轉方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public class Book { private String name; private double price; private String author; public Book() { super(); } public Book(String name, double price, String author) { super(); this.name = name; this.price = price; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public void show() { System.out.println("name = " + name + "; price = " + price + "; author = " + author); } } |
Book.java
首先,我們定義了一個名為 Book 的類別,其中包含了書名、作者與價格三個參數,值得注意的是,當我們將自訂的類別生成物件並轉存成 JSON 格式的字串後,在 JSON 字串裡的物件資料格式,其名稱(key)即是參照到我們物件裡所定義的參數名稱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
. . . // Configures Gson to serialize Date objects according to the pattern provided. Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); String jsonStr = ""; // Data for testing Book book1 = new Book("Java", 500, "John"); Book book2 = new Book("Android", 600, "Allen"); // Object to JSON jsonStr = gson.toJson(book1); System.out.println("Object to JSON: " + jsonStr); // JSON to Object (已知資料類別為 Book 時) System.out.println("JSON to Object: "); Book myBook = gson.fromJson(jsonStr, Book.class); myBook.show(); // get JsonObject's value from JSON (未知資料類別時) System.out.println("get JsonObject's value from JSON: "); JsonObject jsonObject = gson.fromJson(jsonStr, JsonObject.class); String name = jsonObject.get("name").getAsString(); double price = jsonObject.get("price").getAsDouble(); String author = jsonObject.get("author").getAsString(); new Book(name, price, author).show(); System.out.println(); |
mainActivity.java
接著我們透過 setDateFormat() 的方式,定義好時間資料所要的格式,並宣告了兩個基於 Book 類別的物件資料,分別命名為 book1 與 book2,並設定好初始資料,再透過前面宣告好的 gson 物件,使用其 toJson() 方法將物件資料轉換成 Json 字串,亦可以利用其 fromJson() 方法,將一個已知資料類別型態的 Json 字串,直接轉成該類別的物件,這可以省去傳統解析方式還要一筆一筆塞資料的時間,這也是為什麼 Gson 可以大幅縮減解析時間的原因。
但是當我們不知道資料類別為何時該怎麼辦呢?Gson 提供了一個 JsonObject 的通用類別,讓我們在不知資料類別為何時可以使用(通常表示 Server 端不是用 Java 所撰寫),但這樣便會失去 Gson 的便利性,變成類似 Json 傳統解析的模式。
2. 一次要解析多筆物件格式之 Json 與字串格式互轉方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
. . . // Data for testing Book book1 = new Book("Java", 500, "John"); Book book2 = new Book("Android", 600, "Allen"); List<Book> bookList = new ArrayList<Book>(); bookList.add(book1); bookList.add(book2); // List to JSON jsonStr = gson.toJson(bookList); System.out.println("List to JSON: " + jsonStr); // JSON to List System.out.println("JSON to List: "); /* * TypeToken represents a generic type. TypeToken is an abstract class * but with no abstract methods, thus we don't have to override any * method in TypeToken. */ Type collectionType = new TypeToken<List<Book>>() {}.getType(); List<Book> myBookList = gson.fromJson(jsonStr, collectionType); for (Book book : myBookList) { book.show(); } . . . |
mainActivity.java
若是一次要解析多筆物件格式的資料,我們可以先宣告一個 ArrayList,將所有物件存入以後,同樣透過 toJson() 方法將物件陣列的資料直接轉換成 Json 字串,而在將 Json 字串轉換成已知類別資料格式時,因為我們知道將收到的資料格式為 List<Book> 的型別,這邊我們特別宣告了一個 Type 類別的 collectionType 來儲存這個型別,再利用 fromJson() 方法,即可以把此 Json 字串 直接轉換成 List<Book> 型別的資料。
3. 程式裡所宣告的資料物件本身帶有 List 型別之 Json 與字串格式互轉方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
public class Order { private String orderId; private String customer; private Date date; private List<Book> bookList; public Order() { super(); } public Order(String orderId, String customer, Date date, List<Book> bookList) { super(); this.orderId = orderId; this.customer = customer; this.date = date; this.bookList = bookList; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getCustomer() { return customer; } public void setCustomer(String customer) { this.customer = customer; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public List<Book> getBookList() { return bookList; } public void setBookList(ArrayList<Book> bookList) { this.bookList = bookList; } public void show() { System.out.println("Order information:"); System.out.println("orderId = " + orderId + "; customer = " + customer + "; date = " + date); System.out.println("Details: "); for (Book book : bookList) { book.show(); } } } |
還有一種可能,就是程式裡所宣告的資料物件本身帶有 List 型別,我們同樣也可以利用 Gson 類別來加以解析,首先,我們定義了一個名為 Order 的類別,其中包含了訂單、客戶、購買時間與購買清單四個參數,其中購買清單是一個 List 型別的參數,用以存放多個 Book 類別的物件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
. . . // Data for testing Book book1 = new Book("Java", 500, "John"); Book book2 = new Book("Android", 600, "Allen"); List<Book> bookList = new ArrayList<Book>(); bookList.add(book1); bookList.add(book2); Order order = new Order("111", "ron", new Date(), bookList); // Object (with List) to JSON jsonStr = gson.toJson(order); System.out.println("Object (with List) to JSON: " + jsonStr); // JSON to Object (with List) Order myOrder = gson.fromJson(jsonStr, Order.class); myOrder.show(); . . . |
mainActivity.java
由這些例子可知,比起上一篇的範例使用 Json 基本的 API 做解析,在已知所解析資料格式的類別時,使用 Gson 解析會快上許多,且程式碼亦更加精簡。
臉書留言
一般留言