技術學習記錄

[Android]使用Gson序列化/反序列化JSON資料

前言

相信很多人在串接網路獲得的資料,多少會碰到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資料轉換成我們可以處理的格式。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *