Gson은 Google에서 개발한 Java용 JSON 라이브러리입니다. Gson을 활용하면 Java 객체를 JSON으로 변환하거나(직렬화), JSON 문자열을 Java 객체로 변환하는(역직렬화) 작업을 손쉽게 처리할 수 있습니다.
Gson 인스턴스는 GsonBuilder 객체를 생성한 뒤 create() 메서드를 호출하여 만들 수 있습니다. 그리고 중복 키 없이 JSON을 파싱하려면 TypeToken 클래스를 사용해야 합니다. Map 타입에 대한 타입 리터럴(Type Literal)을 생성할 때는 익명 내부 클래스 형태로 선언하는 것이 핵심입니다.
만약 파싱 과정에서 중복된 키가 발견되면 런타임 시 다음과 같은 예외가 발생합니다.
Exception in thread "main" com.google.gson.JsonSyntaxException: duplicate key
이는 Gson이 제네릭 타입 정보를 런타임까지 유지할 수 있도록 도와주는 TypeToken 덕분에 가능한 기능입니다. Java의 타입 소거(Type Erasure) 특성 때문에 일반적인 방법으로는 Map의 제네릭 타입 정보를 얻을 수 없지만, TypeToken을 활용하면 이를 해결할 수 있습니다.
문법(Syntax)
public class TypeToken<T> extends Object
예제 코드(Example)
import java.lang.reflect.Type;
import java.util.Map;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
public class JsonWithoutDuplicateKeysTest {
public static void main(String args[]) throws Exception {
String json = "{\"123\":\"abc\", \"124\":\"def\", \"125\":\"ghi\"}";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Type mapType = new TypeToken<Map<Integer, String>>() {}.getType();
Map<String, String> map = gson.fromJson(json, mapType);
System.out.println(map);
}
}코드 설명
- GsonBuilder().setPrettyPrinting().create(): 보기 좋게 정렬된 JSON 출력을 지원하는 Gson 인스턴스를 생성합니다.
- new TypeToken<Map<Integer, String>>() {}.getType(): 익명 내부 클래스를 통해 Map의 제네릭 타입 정보를 런타임에 전달합니다.
- gson.fromJson(json, mapType): JSON 문자열을 지정된 타입의 Map 객체로 역직렬화하며, 중복 키가 존재하면 JsonSyntaxException을 발생시킵니다.
실행 결과(Output)
{123=abc, 124=def, 125=ghi}이처럼 Gson의 TypeToken 클래스를 활용하면 JSON 파싱 시 중복 키 문제를 런타임 단계에서 명확하게 감지하고 처리할 수 있어, 데이터 무결성을 보장하는 안정적인 애플리케이션 개발에 큰 도움이 됩니다.