Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Serialize và deserialize generic types bằng Gson trong Java

Nếu lớp Java là generic type và dùng với thư viện Gson cho JSON serialization và deserialization. Gson cung cấp lớp com.google.gson.reflect.TypeToken để lưu kiểu generic bằng cách tạo instance TypeToken và truyền kiểu lớp. Nhờ đó Gson biết lớp trong generic class.

Cú pháp

public class TypeToken<T> extends java.lang.Object

Ví dụ minh họa

import java.lang.reflect.Type;
import java.util.*;
import com.google.gson.*;
import com.google.gson.reflect.*;

public class GenericTypesJSONTest {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        List<String> list = Arrays.asList("INDIA", "AUSTRALIA", "ENGLAND", "SOUTH AFRICA");
        
        // Serialize
        String jsonStr = gson.toJson(list);
        System.out.println(jsonStr);
        
        // Deserialize - cần TypeToken
        Type listType = new TypeToken<List<String>>() {}.getType();
        list = gson.fromJson(jsonStr, listType);
        System.out.println(list);
    }
}

Kết quả

[
    "INDIA",
    "AUSTRALIA",
    "ENGLAND",
    "SOUTH AFRICA"
]
[INDIA, AUSTRALIA, ENGLAND, SOUTH AFRICA]

Giải thích: new TypeToken<List<String>>() {} tạo anonymous subclass của TypeToken, capture kiểu generic List<String> tại runtime (tránh type erasure). Pattern này bắt buộc khi deserialize vào generic type (List<T>, Map<K,V>, Custom<T>). Serialize không cần TypeToken.