Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Gson을 사용해 JSON 배열을 제네릭 타입의 List로 역직렬화하는 방법

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>, 중첩된 제네릭 구조 등 다양한 복잡한 타입의 역직렬화에도 동일하게 활용할 수 있습니다.