Java에서 JSON 데이터를 다룰 때 가장 많이 사용되는 라이브러리 중 하나인 Gson은 제네릭 타입 정보를 유지하면서 역직렬화를 수행할 수 있는 강력한 기능을 제공합니다. 일반적인 fromJson() 호출만으로는 런타임에 제네릭 타입 정보가 소실되는 타입 소거(Type Erasure) 문제 때문에 List<Student> 같은 제네릭 컬렉션으로 직접 변환하기 어렵습니다.
이 문제를 해결하기 위해 Gson은 com.google.gson.reflect.TypeToken 클래스를 제공합니다. TypeToken은 익명 하위 클래스를 생성하는 방식으로 제네릭 타입 정보를 캡처하여, Gson이 역직렬화 시 어떤 클래스로 변환해야 하는지 정확히 알 수 있도록 도와줍니다.
TypeToken 클래스 문법
public class TypeToken<T> extends Object
JSON 배열을 List로 역직렬화하는 예제
아래 예제는 JSON 배열 문자열을 ArrayList<Student> 타입의 리스트로 역직렬화하는 전체 과정을 보여줍니다.
import java.lang.reflect.Type;
import java.util.*;
import com.google.gson.*;
import com.google.gson.reflect.*;
public class JSONArrayToListTest {
public static void main(String args[]) throws Exception {
String jsonStr = "[{\"name\":\"Adithya\", \"course\":\"Java\"},"
+ "{\"name\":\"Ravi\", \"course\":\"Python\"}]";
// TypeToken을 사용해 제네릭 타입 정보를 캡처
Type listType = new TypeToken<ArrayList<Student>>() {}.getType();
// JSON 문자열을 List<Student>로 역직렬화
List<Student> students = new Gson().fromJson(jsonStr, listType);
System.out.println(students);
}
}
// Student 클래스
class Student {
String name;
String course;
@Override
public String toString() {
return "Student [name=" + name + ", course=" + course + "]";
}
}실행 결과
[Student [name=Adithya, course=Java], Student [name=Ravi, course=Python]]
핵심 포인트 정리
new TypeToken<ArrayList<Student>>() {}에서 중괄호({})는 익명 하위 클래스를 생성하는 부분으로, 이를 통해 런타임에도 제네릭 타입 정보가 보존됩니다.getType()메서드는 캡처된 제네릭 타입에 해당하는Type객체를 반환합니다.- Gson 2.x 버전 기준으로
fromJson(String json, Type typeOfT)형태로 호출하여 제네릭 리스트 역직렬화가 가능합니다.
이 방식은 JSON 배열뿐만 아니라 Map<String, T>, 중첩된 제네릭 구조 등 다양한 복잡한 타입의 역직렬화에도 동일하게 활용할 수 있습니다.