[java] Gson 라이브러리에서 커스텀 어댑터를 사용하는 방법은?

Gson은 자바 객체를 JSON 형식으로 변환하거나, JSON을 자바 객체로 변환하는 라이브러리입니다. Gson을 사용하면 객체 직렬화와 역직렬화 작업을 간편하게 처리할 수 있습니다.

커스텀 어댑터를 사용하면 Gson이 기본적으로 지원하지 않는 특정한 형식의 데이터를 처리할 수 있습니다. 예를 들어, Gson이 기본적으로 제공하지 않는 Date 객체를 JSON으로 직렬화하거나, JSON에서 Date 객체를 역직렬화하는 작업을 할 수 있습니다.

커스텀 어댑터를 만들기 위해서는 JsonSerializerJsonDeserializer 인터페이스를 구현해야 합니다. JsonSerializer는 객체를 JSON으로 변환하는 역할을 하고, JsonDeserializer는 JSON을 객체로 변환하는 역할을 합니다.

다음은 Gson에서 커스텀 어댑터를 사용하는 예제 코드입니다.

import com.google.gson.*;

public class CustomAdapterExample {
    public static void main(String[] args) {
        // Gson 인스턴스 생성
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Date.class, new DateAdapter())
                .create();

        // Date 객체를 JSON으로 직렬화
        Date currentDate = new Date();
        String json = gson.toJson(currentDate);
        System.out.println("Serialized JSON: " + json);

        // JSON을 Date 객체로 역직렬화
        Date deserializedDate = gson.fromJson(json, Date.class);
        System.out.println("Deserialized Date: " + deserializedDate);
    }
}

class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
    private final DateFormat dateFormat;

    DateAdapter() {
        dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    }

    @Override
    public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(dateFormat.format(date));
    }

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return dateFormat.parse(json.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}

위의 예제에서는 Gson 인스턴스를 생성할 때 registerTypeAdapter 메소드를 사용하여 Date 형식에 대한 커스텀 어댑터를 등록했습니다. DateAdapter 클래스는 JsonSerializer와 JsonDeserializer 인터페이스를 구현하고 있으며, serialize 메소드는 Date 객체를 JSON으로 변환하고, deserialize 메소드는 JSON을 Date 객체로 변환합니다.

이렇게 커스텀 어댑터를 사용하면 Gson에서 기본적으로 처리하지 못하는 형식의 데이터를 쉽게 처리할 수 있습니다.

참고 문서: