GSON 前言
JSON是很常見的資料交換格式,在JAVA領域常用處理JSON的函式庫:GSON、FastXML和JSON-B,本章節會以GSON為主,學習目標如下
- JSON格式說明
- GSON 套件函式
- GSON: 物件轉換JSON字串
- GSON: JSON字串轉換物件
JSON 格式說明
JSON全名為JavaScript Object Notation,它是一種輕量級的資料交換格式,會大為流行的理由,主要是他比傳統用xml更輕巧且容易處理,JSON表達方式物件會用大括弧{},陣列則是用中括號[]。
用JSON字串來表達Employee的物件內容,由JSON字串可以知道物件name、age、sex和salary屬性。
JSON表示員工資料方式:
{“name”:”Jack Bryant”, “age”:18, “sex”:”M”,”salary”:3500.00}
JSON陣列表示方式:
跟我們使用JAVA的陣列方式類似,內容值可以是數字’、文字、布林、陣列、物件、null等等。
範例:
字串: [“紅”、”橙”、”黃”、”綠”、”青”、”藍”、”紫”}
布林: [true, true, false, false, true, true]
GSON 套件函式
Gson為google所發布的函式庫,主要將物件與json字串之間的轉換時方便使用。當我們將JAVA物件轉換成JSON字串稱為序列化,JSON字串轉換至JAVA物件稱為反序列化。
GSON: 物件轉換JSON字串
有了JSON基本概念後,我們進入本章重點,首先我們需要建立員工類別(Employee),定義如下
物件 | 屬性 |
---|---|
員工類別 Employee | name 名字 age 年紀 sex 性別 salary 薪水 |
/** * name:員工類別 */ public class Employee implements Serializable { //constructor public Employee(String name, double salary){ this.name = name; this.salary = salary; } // employ's attribute private String name ; private int age ; private String sex; private double salary ; //setter and getter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { StringBuffer sb = new StringBuffer() ; sb.append("") ; sb.append("name:"+name) ; sb.append("age:"+age) ; sb.append("sex:"+sex) ; sb.append("salary:"+salary) ; sb.append("") ; return sb.toString() ; } }
完成員工類別後,實際建立一個employee01 的物件,在使用Gson之前需要宣告Gson建構子,範例不管單數還是多數的物件,都是利用同一個toJson()方法來完成序列化轉成JSON字串,所使用起來相當方便。由結果可以發現兩件事情,一、我們發現單數和多數Json字串不同,多數物件顯示會有中括號[物件1、物件2]包括,但是單數沒有。二、Json字串缺少顯示sex屬性值,其將sex屬性列印出來後發現為null值,表示Gson會預先將屬性值為null的預先過濾掉後,才轉成JSON字串。這種方式並不會影響之後反序列處理。後續會有更詳細的Gson字串處理介紹
/** * name : 員工轉json字串測試 */ public class EmployeeTest { public static void main(String[] arg){ //單筆 Employee employee01 = new Employee("bryan",30000); Employee employee02 = new Employee("joe",31000); employee02.setSex("N"); Gson gson = new Gson(); String jsonStr1 = gson.toJson(employee01); String jsonStr2 = gson.toJson(employee01,Employee.class); System.out.println("jsonStr1:"+jsonStr1); System.out.println("jsonStr2:"+jsonStr2); //多筆 List list = new ArrayList(); list.add(employee01) ; list.add(employee02) ; String jsonStr3 = gson.toJson(list); System.out.println("jsonStr3:"+jsonStr3); } }
結果:
jsonStr1:{“name”:”bryan”,”age”:0,”salary”:30000.0}
jsonStr2:{“name”:”bryan”,”age”:0,”salary”:30000.0}
jsonStr3:[{“name”:”bryan”,”age”:0,”salary”:30000.0},{“name”:”joe”,”age”:0,”sex”:”N”,”salary”:31000.0}]
物件關係表達
接下來我們將物件關係也加入,看Gson是否可以順利轉換成正確JSON字串,首先我們新增兩個物件:書明細(Book)和借書訂單(Order),之間的關係為員工借書會點選借書訂單系統,去挑選他的書明細,該系統會記錄該員工的姓名以及他點選書單的明細。
物件 | 屬性 |
---|---|
書明細 Book | bid 書單號 title書名稱 author 作者 |
借書訂單 Order | orderId 訂單編號 employName 員工名稱 date 日期 bookList 書明細資料 |
/** * name : 書明細 */ public class Book { private String bid; private String title; private String author; public Book(String bid, String title, String author) { this.bid = bid ; this.title = title ; this.author = author ; } //setter and getter public String getBId() { return bid; } public void setBId(String id) { this.bid = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { StringBuffer sb = new StringBuffer() ; sb.append("") ; sb.append("bid:"+bid) ; sb.append("title:"+title) ; sb.append("author:"+author) ; sb.append("") ; return sb.toString() ; } } /** * name : 借書訂單 */ public class Order { private String orderId; private String employName; private Date date; private List bookList; public Order(String orderId, String employName, Date date, List bookList) { super(); this.orderId = orderId; this.employName = employName; this.date = date; this.bookList = bookList; } //setter and getter public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getEmployName() { return employName; } public void setEmployName(String employName) { this.employName = employName; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public List getBookList() { return bookList; } public void setBookList(ArrayList bookList) { this.bookList = bookList; } public void show() { System.out.println("Order information:"); System.out.println("orderId = " + orderId + "; employName = " + employName + "; date = " + date); System.out.println("Details: "); System.out.println(bookList.toString()); } }
employee01藉兩本書分別編號為B0001和B0002,這兩本書,我們把它加入oreder建構子中,再由Gson轉換成JSON字串出來,由結果顯示可以知道該訂單借了幾本書和是哪位員工借走。
/** * name : 借書訂單轉json字串測試 */ public class OrderTest { public static void main(String[] arg){ //單筆 Employee employee01 = new Employee("bryan",30000); Employee employee02 = new Employee("joe",31000); Book book01 = new Book("B0001","水滸傳","施耐庵 ") ; Book book02 = new Book("B0002","西遊記","吳承恩 ") ; Book book03 = new Book("B0003","三國演義","羅貫中 ") ; Book book04 = new Book("B0004","紅樓夢","曹雪芹 ") ; List bList = new ArrayList
JSON字串轉換物件
之前員工建立的Json字串,現在介紹如何用Gson來反序列Employee物件,有範例可以知道,Gson幾行就可以將JSON轉成物件化,用起來相當方便。
範例: JSON字串: {“name”:”bryan”,”age”:0,”salary”:30000.0}
/** * name: Json to Object 反序列範例 */ public class EmployeeSTest { public static void main(String[] ags){ Gson gson = new Gson(); String employ_json = "{\"name\":\"bryan\",\"age\":0,\"salary\":30000.0}" ; Employee employee01 = gson.fromJson(employ_json, Employee.class) ; System.out.println(employee01.toString()); } }
再來我們試看看List串列看看,是否可以也是跟上面宣告多數的物件相同,複數物件反序列比較麻煩一點,因為反序列需要告訴預先要轉換哪種類別,利用new TypeToken的方式來取得類別的類型,再使用fromJson方法轉回List<Employee>類型。
問題延伸: 但如果遇到泛型要如何解決?
Json字串: [{“name”:”bryan”,”age”:0,”salary”:30000.0},{“name”:”joe”,”age”:0,”sex”:”N”,”salary”:31000.0}]
/** * name: Json to Object 反序列範例 */ public class EmployeeSTest { public static void main(String[] ags){ Gson gson = new Gson(); String employ_json = "{\"name\":\"bryan\",\"age\":0,\"salary\":30000.0}" ; Employee employee01 = gson.fromJson(employ_json, Employee.class) ; System.out.println(employee01.toString()); System.out.println("=========================List==========================="); String employs_json = "[{\"name\":\"bryan\",\"age\":0,\"salary\":30000.0},{\"name\":\"joe\",\"age\":0,\"sex\":\"N\",\"salary\":31000.0}]"; Type collectionType = new TypeToken
留言
張貼留言