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.