前言
相信很多人在串接網路獲得的資料,多少會碰到JSON格式的解析吧?
關於JSON
JSON是一種輕量級的資料交換格式,內容為key-value的形式表示,也因此具備容易閱讀、處理的優勢。
JSON是獨立在程式語言之外的資料格式,目前已有許多的程式語言能夠對它進行解析。
JSON支援的資料類型如下:
- 數值:10進位數,可包含正負號及小數點及指數(e)
- 字串:以雙引號將字串的前後包起來表示
- 布林值:true或false
- 陣列:使用中括弧
[]
包住,元素之間使用逗號,
表示區隔 - 物件:使用大括弧
{}
包住,元素之間使用逗號,
表示區隔 - 空值:數值以null表示
這裡用一個JSON格式的資料來示範,如下:
{
"name": "王小明",
"age": 18,
"grade_number": 3,
"class_number": 10,
"student_id": "11012345",
"gender": "男",
"subject_grades": [
{
"subject": "國文",
"score": 95
},
{
"subject": "英文",
"score": 99
},
{
"subject": "數學",
"score": 85
},
{
"subject": "物理",
"score": 83
},
{
"subject": "化學",
"score": 91
},
{
"subject": "生物",
"score": 93
}
]
}
關於更多JSON格式的介紹,請參考維基百科。
序列化/反序列化
所謂的序列化,是將資料結構轉換成我們可取用的格式。
而反序列化則是將我們可取用的東西,轉換回資料結構。
就拿JSON來解釋好了,我們從WebAPI取得的資料通常會是以JSON格式的資料呈現。
在程式語言的世界裡,我們拿到的這包JSON資料實際上是一串長字串。
因此我們必須要透過序列化的方式將資料轉換成我們可取用的格式,例如自定義的data model class。
使用Gson序列化
前面已經提到, 我們必須要透過序列化的方式將JSON資料轉換成我們可取用的格式。
在JAVA的世界中,JSON實際上有好幾種套件可以協助我們進行序列化處理。
在這裡我們使用Google的Gson來將JSON資料序列化/反序列化。
1.在app模組中的build.gradle加入gson套件庫,如下:
dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}
2.對照JSON資料,生成自訂的data model class,如下:
// Student.java
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.List;
public class Student implements Serializable {
private String name;
private int age;
@SerializedName("grade_number") private int gradeNumber;
@SerializedName("class_number") private int classNumber;
@SerializedName("student_id") private String studentID;
private String gender;
@SerializedName("subject_grades") private List<SubjectGrade> subjectGrades;
public String getName() { return name; }
public void setName(String value) { this.name = value; }
public int getAge() { return age; }
public void setAge(int value) { this.age = value; }
public int getGradeNumber() { return gradeNumber; }
public void setGradeNumber(int value) { this.gradeNumber = value; }
public int getClassNumber() { return classNumber; }
public void setClassNumber(int value) { this.classNumber = value; }
public String getStudentID() { return studentID; }
public void setStudentID(String value) { this.studentID = value; }
public String getGender() { return gender; }
public void setGender(String value) { this.gender = value; }
public List<SubjectGrade> getSubjectGrades() { return subjectGrades; }
public void setSubjectGrades(List<SubjectGrade> value) { this.subjectGrades = value; }
}
// SubjectGrade.java
import java.io.Serializable;
public class SubjectGrade implements Serializable {
private String subject;
private int score;
public String getSubject() { return subject; }
public void setSubject(String value) { this.subject = value; }
public int getScore() { return score; }
public void setScore(int value) { this.score = value; }
}
序列化
序列化用法如下:
Gson gson = new Gson();
Student student = gson.fromJson(jsonStr, Student.class);
System.out.println("姓名: " + student.getName() + ", 年齡: " + student.getAge() + ", 學號: " + student.getStudentID());
System.out.println(student.getGradeNumber() + "年" + student.getClassNumber() + "班");
for (SubjectGrade subjectGrade : student.getSubjectGrades()) {
System.out.println("科目: " + subjectGrade.getSubject() + ", 分數: " + subjectGrade.getScore());
}
以下為執行結果:
System.out: 姓名: 王小明, 年齡: 18, 學號: 11012345
System.out: 3年10班
System.out: 科目: 國文, 分數: 95
System.out: 科目: 英文, 分數: 99
System.out: 科目: 數學, 分數: 85
System.out: 科目: 物理, 分數: 83
System.out: 科目: 化學, 分數: 91
System.out: 科目: 生物, 分數: 93
反序列化
用法如下:
String deserializeStr = gson.toJson(student, Student.class);
以下為執行結果:
System.out: 反序列化結果: {"age":18,"class_number":10,"gender":"男","grade_number":3,"name":"王小明","student_id":"11012345","subject_grades":[{"score":95,"subject":"國文"},{"score":99,"subject":"英文"},{"score":85,"subject":"數學"},{"score":83,"subject":"物理"},{"score":91,"subject":"化學"},{"score":93,"subject":"生物"}]}
結尾
以上是使用Gson將JSON資料序列化/反序列化的基本用法。
JSON目前是最廣泛使用的資料交換格式,尤其是與後端伺服器交換資料時都是透過JSON。
因此學會處理JSON是一件非常重要的事。
也感謝Google提供了Gson這個方便的套件,讓我們可以很輕鬆地將JSON資料轉換成我們可以處理的格式。