Cách sử dụng Gson để serialize data thành json trong java

JSON là gì ?

JSON hay còn gọi là Javascript Object Notation, là 1 kiểu (định dạng) dữ liệu dùng để lưu trữ và truyền tải dữ liệu (tương tự XML), thông thường được dùng để tương tác giữa client và server trong lập trình web. Json and xml

Ứng dụng của JSON

JSON được sử dụng cực kì rộng rãi trong phát triển các dự án web nếu như không muốn nói là hầu hết (trừ 1 số dự án cũ thì vẫn dùng XML). Hãy mở 1 trang web bất kì rồi bật developer tool (F12), chuyển sang tab Network, chọn Fetch/XHR, ở đây mình demo trang chủ angular.io, ta sẽ thấy response cho bài viết chính là JSON:

JSON response for a website

JSON được support ngay trên trình duyệt với 2 phương thức là JSON.stringify() để đưa object về json và ngược lại là JSON.parse() để đưa string thành js object, bây giờ mình sẽ vào console của browser gõ đoạn code sau:

let students = [
  {
    name: "Thomas Cloaker",
    age: 23,
  },
  {
    name: "Lee Jung Jae",
    age: 41,
  },
  {
    name: "Kien Dinh",
    age: 21,
    comment: "Sieu cap vip pro",
  },
];
JSON.stringify(students);

Kết quả: Json trong console trình duyệt

Json và Gson trong java

Đã khi nào bạn bực bội vì loay hoay tìm cách lưu dữ liệu trong app java ra file văn bản chưa ? Lưu ra là 1 chuyện nhưng để đọc ngược lại nó vào chương trình lại là 1 chuyện khác, Gson sẽ giúp bạn làm việc này cực kì đơn giản.

Gson là 1 thư viện được dùng để chuyển đổi java object thành JSON và ngược lại, thư viện này được anh lớn Google phát triển nên các bạn có thể yên tâm sử dụng. Ưu điểm của Gson chính là không cần phải thêm annotation hay implement phương thức nào vào code gốc của bạn.

Cài đặt GSON bằng maven

Bài này mình sẽ hướng dẫn sử dụng Gson bằng maven, các bạn có thể làm tương tự với Graddle hay các framework khác, nếu chưa biết Maven là gì, hãy tìm hiểu bài viết sau: Cách cài đặt JDBC bằng maven.

Thêm dependency vào file pom.xml (nếu muốn dùng phiên bản khác hãy truy cập maven ở đây):

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

Mình sẽ demo cách dùng Gson để serialize 1 arraylist object, các bạn có thể tham khảo document của gson ở đây để làm tương tự với các đối tượng khác.

Tạo 1 project có cấu trúc như sau: project demo structure

Class Employee:

public class Employee {
    private String name;
    private int age;
    private String note;

    public Employee(String name, int age, String note) {
        this.name = name;
        this.age = age;
        this.note = note;
    }

    public String toString() {
        return this.name + ", Age: " + this.age + ", Note: " + this.note;
    }
}

Class Main để ghi dữ liệu vào file output và đọc ngược lại để hiển thị:


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Main {
    private static final String FILE_NAME = "output.txt";

    public static void main(String[] args) {
        List<Employee> sampleData = new ArrayList<>();
        sampleData.add(new Employee("Kien Dinh", 21, "Siêu cấp víp pro"));
        sampleData.add(new Employee("Thomas Anderson", 31, "NPC"));
        sampleData.add(new Employee("John Doe", 21, "Easter Eggs"));

        saveData(sampleData);

        List<Employee> importedList = loadData();
        System.out.println("Data imported, printing...");
        importedList.forEach(employee -> System.out.println(employee.toString()));
    }

    static void saveData(List<Employee> employeeList){
        System.out.println("Save data to file...");

        // Lấy kiểu dữ liệu để đưa sang Json
        Type listType = new TypeToken<List<Employee>>(){}.getType();
        // Convert object thành json string
        String jsonData = new Gson().toJson(employeeList, listType);
        // Lưu ra file:
        try {
            FileWriter writer = new FileWriter(FILE_NAME);
            writer.write(jsonData);
            writer.close();
            System.out.println("Saved.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static List<Employee> loadData(){
        List<Employee> employeeList = new ArrayList<>();
        System.out.println("Loading data...");
        // Lấy kiểu dữ liệu để đưa json thành object.
        Type listType = new TypeToken<List<Employee>>(){}.getType();
        // Đọc dữ liệu từ file.
        String jsonData = null;
        try {
            jsonData = new String(Files.readAllBytes(Paths.get(FILE_NAME)), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Chuyển đổi string json thành object
        employeeList = new Gson().fromJson(jsonData, listType);
        return employeeList;
    }
}

Kết quả: console-output-gson.png

Ngoài Array List thì các bạn hoàn toàn có thể sử dụng Gson để lưu trữ cấu trúc dữ liệu riêng của bạn, thậm chí là cây nhị phân (Binary Tree).

Happy coding !

Published under Java on .

Kiên Đinh

Bần đạo là Kiên Đinh, một Developer. Ta viết blog này với mục đích chia sẻ những kinh nghiệm của bản thân đối với coding chi đạo.