Xử lý Chuyển đổi JSON và Sắp xếp Danh sách Đối tượng trong Java

Trong phát triển ứng dụng Java, việc xử lý dữ liệu ở định dạng JSON là một tác vụ phổ biến, đặc biệt khi làm việc với API RESTful. Bài viết này sẽ hướng dẫn cách chuyển đổi dữ liệu giữa chuỗi JSON, đối tượng Java (POJO) và danh sách các đối tượng, cùng với cách sắp xếp một danh sách các đối tượng tùy chỉnh.

Chuyển đổi từ Chuỗi JSON sang Đối tượng Java (POJO)

Việc chuyển đổi một chuỗi JSON thành một hoặc nhiều đối tượng Java là một phần thiết yếu trong việc đọc dữ liệu từ các nguồn bên ngoài.

1. Chuyển đổi JSON String thành một Đối tượng Java duy nhất

Để chuyển đổi một chuỗi JSON đại diện cho một đối tượng duy nhất thành một đối tượng Java tương ứng, chúng ta có thể sử dụng phương thức JSON.parseObject() từ thư viện Fastjson. Trước tiên, cần có một lớp Java (POJO) với các thuộc tính khớp với cấu trúc JSON.


import com.alibaba.fastjson.JSON;

// Định nghĩa lớp đối tượng sản phẩm
public class SanPham {
    private String maSanPham;
    private String tenSanPham;
    private double giaTien;
    private int soLuongTonKho;

    // Constructors, Getters, Setters
    public SanPham() {}

    public SanPham(String maSanPham, String tenSanPham, double giaTien, int soLuongTonKho) {
        this.maSanPham = maSanPham;
        this.tenSanPham = tenSanPham;
        this.giaTien = giaTien;
        this.soLuongTonKho = soLuongTonKho;
    }

    public String getMaSanPham() { return maSanPham; }
    public void setMaSanPham(String maSanPham) { this.maSanPham = maSanPham; }
    public String getTenSanPham() { return tenSanPham; }
    public void setTenSanPham(String tenSanPham) { this.tenSanPham = tenSanPham; }
    public double getGiaTien() { return giaTien; }
    public void setGiaTien(double giaTien) { this.giaTien = giaTien; }
    public int getSoLuongTonKho() { return soLuongTonKho; }
    public void setSoLuongTonKho(int soLuongTonKho) { this.soLuongTonKho = soLuongTonKho; }

    @Override
    public String toString() {
        return "SanPham{maSanPham='" + maSanPham + "', tenSanPham='" + tenSanPham + "', giaTien=" + giaTien + ", soLuongTonKho=" + soLuongTonKho + '}';
    }
}

Sau khi có lớp SanPham, bạn có thể thực hiện chuyển đổi:


import com.alibaba.fastjson.JSON;

public class JsonToPojoExample {
    public static void main(String[] args) {
        String duLieuJsonSanPham = "{ \"maSanPham\": \"SP001\", \"tenSanPham\": \"Bàn Phím Cơ\", \"giaTien\": 120.50, \"soLuongTonKho\": 50 }";

        // Chuyển đổi chuỗi JSON thành đối tượng SanPham
        SanPham sanPham = JSON.parseObject(duLieuJsonSanPham, SanPham.class);

        System.out.println("Đối tượng SanPham đã chuyển đổi:");
        System.out.println(sanPham);
        System.out.println("Tên sản phẩm: " + sanPham.getTenSanPham());
    }
}

2. Chuyển đổi JSON String thành Danh sách các Đối tượng Java

Nếu chuỗi JSON chứa một mảng các đối tượng, bạn có thể chuyển đổi nó thành một List các đối tượng Java bằng phương thức JSON.parseArray().


import com.alibaba.fastjson.JSON;
import java.util.List;

public class JsonToListPojoExample {
    public static void main(String[] args) {
        String duLieuJsonDanhSachSanPham = "[ { \"maSanPham\": \"SP002\", \"tenSanPham\": \"Chuột Không Dây\", \"giaTien\": 35.00, \"soLuongTonKho\": 100 }, { \"maSanPham\": \"SP003\", \"tenSanPham\": \"Màn Hình 27 Inch\", \"giaTien\": 250.99, \"soLuongTonKho\": 20 } ]";

        // Chuyển đổi chuỗi JSON mảng thành List<SanPham>
        List<SanPham> danhSachSanPham = JSON.parseArray(duLieuJsonDanhSachSanPham, SanPham.class);

        System.out.println("\nDanh sách SanPham đã chuyển đổi:");
        for (SanPham sp : danhSachSanPham) {
            System.out.println(sp);
        }
    }
}

Chuyển đổi từ Đối tượng Java sang Chuỗi JSON

Ngược lại, khi bạn cần gửi dữ liệu đối tượng Java đến một dịch vụ web hoặc lưu trữ, việc chuyển đổi đối tượng Java thành chuỗi JSON là cần thiết.

1. Chuyển đổi một Đối tượng Java thành JSON String

Sử dụng phương thức JSON.toJSONString() để chuyển đổi một đối tượng Java đơn lẻ thành chuỗi JSON.


import com.alibaba.fastjson.JSON;

public class PojoToJsonExample {
    public static void main(String[] args) {
        SanPham sanPhamMoi = new SanPham("SP004", "Webcam Full HD", 75.00, 30);

        // Chuyển đổi đối tượng SanPham thành chuỗi JSON
        String jsonSanPham = JSON.toJSONString(sanPhamMoi);

        System.out.println("\nĐối tượng SanPham đã chuyển đổi thành JSON:");
        System.out.println(jsonSanPham);
    }
}

2. Chuyển đổi Danh sách Đối tượng Java thành JSON Array String

Tương tự, JSON.toJSONString() cũng có thể được dùng để chuyển đổi một List các đối tượng Java thành một chuỗi JSON đại diện cho một mảng JSON.


import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

public class ListPojoToJsonExample {
    public static void main(String[] args) {
        List<SanPham> sanPhamDeXuat = new ArrayList<>();
        sanPhamDeXuat.add(new SanPham("SP005", "Tai Nghe Gaming", 99.00, 45));
        sanPhamDeXuat.add(new SanPham("SP006", "Ổ Cứng SSD 1TB", 150.00, 25));

        // Chuyển đổi danh sách SanPham thành chuỗi JSON mảng
        String jsonDanhSachSanPham = JSON.toJSONString(sanPhamDeXuat);

        System.out.println("\nDanh sách SanPham đã chuyển đổi thành JSON Array:");
        System.out.println(jsonDanhSachSanPham);
    }
}

Sắp xếp Danh sách các Đối tượng Java Tùy chỉnh

Để sắp xếp một List các đối tượng tùy chỉnh của bạn, các đối tượng đó cần phải triển khai giao diện Comparable hoặc bạn có thể sử dụng một Comparator riêng biệt. Ở đây, chúng ta sẽ tập trung vào việc triển khai Comparable.

1. Sử dụng Comparable để sắp xếp đối tượng

Lớp đối tượng cần được sắp xếp phải triển khai giao diện Comparable<T> và override phương thức compareTo(T other). Phương thức này định nghĩa cách hai đối tượng của cùng một lớp được so sánh với nhau.

Ví dụ, chúng ta sẽ sửa đổi lớp SanPham để có thể sắp xếp theo giaTien (giá tiền):


import java.util.Collections; // Import này cần cho Collections.sort()
import java.util.ArrayList;   // Import này cần cho ArrayList
import java.util.List;        // Import này cần cho List

public class SanPham implements Comparable<SanPham> {
    private String maSanPham;
    private String tenSanPham;
    private double giaTien;
    private int soLuongTonKho;

    // Constructors, Getters, Setters (như trên)
    public SanPham() {}
    public SanPham(String maSanPham, String tenSanPham, double giaTien, int soLuongTonKho) {
        this.maSanPham = maSanPham;
        this.tenSanPham = tenSanPham;
        this.giaTien = giaTien;
        this.soLuongTonKho = soLuongTonKho;
    }

    public String getMaSanPham() { return maSanPham; }
    public void setMaSanPham(String maSanPham) { this.maSanPham = maSanPham; }
    public String getTenSanPham() { return tenSanPham; }
    public void setTenSanPham(String tenSanPham) { this.tenSanPham = tenSanPham; }
    public double getGiaTien() { return giaTien; }
    public void setGiaTien(double giaTien) { this.giaTien = giaTien; }
    public int getSoLuongTonKho() { return soLuongTonKho; }
    public void setSoLuongTonKho(int soLuongTonKho) { this.soLuongTonKho = soLuongTonKho; }

    @Override
    public String toString() {
        return "SanPham{maSanPham='" + maSanPham + "', tenSanPham='" + tenSanPham + "', giaTien=" + giaTien + ", soLuongTonKho=" + soLuongTonKho + '}';
    }

    // Ghi đè phương thức compareTo để sắp xếp theo giaTien (tăng dần)
    @Override
    public int compareTo(SanPham sanPhamKhac) {
        // So sánh giá tiền. Trả về số âm nếu đối tượng hiện tại nhỏ hơn,
        // số dương nếu lớn hơn, và 0 nếu bằng.
        return Double.compare(this.giaTien, sanPhamKhac.giaTien);
        
        // Để sắp xếp giảm dần:
        // return Double.compare(sanPhamKhac.giaTien, this.giaTien);
    }
}

2. Ví dụ về cách sắp xếp

Sau khi lớp đối tượng đã triển khai Comparable, bạn có thể gọi phương thức tĩnh Collections.sort() để sắp xếp danh sách.


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SapXepDanhSachSanPhamExample {
    public static void main(String[] args) {
        List<SanPham> khoHang = new ArrayList<>();
        khoHang.add(new SanPham("SP007", "Loa Bluetooth", 80.00, 60));
        khoHang.add(new SanPham("SP008", "Máy Ảnh KTS", 450.00, 15));
        khoHang.add(new SanPham("SP009", "Sạc Dự Phòng", 25.00, 200));
        khoHang.add(new SanPham("SP010", "Router Wifi", 60.00, 40));

        System.out.println("Danh sách sản phẩm trước khi sắp xếp:");
        khoHang.forEach(System.out::println);

        // Sắp xếp danh sách
        Collections.sort(khoHang);

        System.out.println("\nDanh sách sản phẩm sau khi sắp xếp theo giá tiền (tăng dần):");
        khoHang.forEach(System.out::println);
    }
}

Thẻ: Java JSON fastjson Serialization Deserialization

Đăng vào ngày 10 tháng 7 lúc 11:14