JAVA

[JAVA] Gson과 날짜/시간 처리

인생아 2024. 12. 14. 17:18
반응형

Gson은 JSON 직렬화 및 역직렬화 과정에서 날짜와 시간을 처리하는 다양한 방법을 제공합니다. 기본적으로 ISO 8601 형식으로 날짜를 처리하지만, 필요에 따라 사용자 정의 날짜 포맷을 설정하거나, 최신 java.time API(LocalDate, LocalDateTime 등)와 통합할 수 있습니다.

기본 날짜 형식 처리

Gson은 java.util.Date를 기본적으로 처리할 수 있으며, 이를 ISO 8601 형식으로 직렬화합니다. 하지만 개발 환경에 따라 표준 형식이 다를 수 있습니다.

기본 날짜 형식 예제

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        // Date 객체 생성
        Person person = new Person("김철수", new Date());

        // Gson 기본 객체 생성
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        // 직렬화
        String json = gson.toJson(person);
        System.out.println("기본 날짜 형식 직렬화:");
        System.out.println(json);

        // 역직렬화
        String inputJson = "{\"name\":\"김철수\",\"birthDate\":\"Dec 13, 2024, 3:45:06 PM\"}";
        Person deserializedPerson = gson.fromJson(inputJson, Person.class);
        System.out.println("\n역직렬화된 객체:");
        System.out.println("이름: " + deserializedPerson.name);
        System.out.println("생일: " + deserializedPerson.birthDate);
    }
}

class Person {
    String name;
    Date birthDate;

    public Person(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}

출력 결과:

기본 날짜 형식 직렬화:
{
  "name": "김철수",
  "birthDate": "Dec 13, 2024, 3:45:06 PM"
}

역직렬화된 객체:
이름: 김철수
생일: Fri Dec 13 15:45:06 KST 2024

기본 처리 방식은 간단하지만, 읽기 어려운 형식으로 출력될 수 있어 사용자 정의 포맷을 설정하는 경우가 많습니다.

반응형

사용자 정의 날짜 포맷 지정

SimpleDateFormat을 사용하여 직렬화와 역직렬화에 사용할 날짜 형식을 직접 정의할 수 있습니다.

사용자 정의 날짜 포맷 예제

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        // Date 객체 생성
        Event event = new Event("서울 마라톤", new Date());

        // 사용자 정의 날짜 포맷
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .setPrettyPrinting()
                .create();

        // 직렬화
        String json = gson.toJson(event);
        System.out.println("사용자 정의 날짜 형식 직렬화:");
        System.out.println(json);

        // 역직렬화
        String inputJson = "{\"name\":\"서울 마라톤\",\"eventDate\":\"2024-12-13 15:45:06\"}";
        Event deserializedEvent = gson.fromJson(inputJson, Event.class);
        System.out.println("\n역직렬화된 객체:");
        System.out.println("이름: " + deserializedEvent.name);
        System.out.println("날짜: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(deserializedEvent.eventDate));
    }
}

class Event {
    String name;
    Date eventDate;

    public Event(String name, Date eventDate) {
        this.name = name;
        this.eventDate = eventDate;
    }
}

출력 결과:

사용자 정의 날짜 형식 직렬화:
{
  "name": "서울 마라톤",
  "eventDate": "2024-12-13 15:45:06"
}

역직렬화된 객체:
이름: 서울 마라톤
날짜: 2024-12-13 15:45:06

 

LocalDate, LocalDateTime 등 java.time API와 통합

Java 8 이상에서는 java.time API를 사용해 날짜와 시간을 처리합니다. Gson은 기본적으로 이를 지원하지 않으므로 별도의 어댑터를 사용해야 합니다.

java.time 어댑터를 사용한 예제

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonSerializer;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Custom Serializer & Deserializer
        JsonSerializer<LocalDateTime> serializer = (src, typeOfSrc, context) ->
                context.serialize(src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        JsonDeserializer<LocalDateTime> deserializer = (json, typeOfT, context) ->
                LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        // Gson 객체 생성
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(LocalDateTime.class, serializer)
                .registerTypeAdapter(LocalDateTime.class, deserializer)
                .setPrettyPrinting()
                .create();

        // 객체 생성
        Meeting meeting = new Meeting("팀 회의", LocalDateTime.now());

        // 직렬화
        String json = gson.toJson(meeting);
        System.out.println("java.time 직렬화:");
        System.out.println(json);

        // 역직렬화
        String inputJson = "{\"title\":\"팀 회의\",\"meetingTime\":\"2024-12-13 15:45:06\"}";
        Meeting deserializedMeeting = gson.fromJson(inputJson, Meeting.class);
        System.out.println("\n역직렬화된 객체:");
        System.out.println("제목: " + deserializedMeeting.title);
        System.out.println("시간: " + deserializedMeeting.meetingTime);
    }
}

class Meeting {
    String title;
    LocalDateTime meetingTime;

    public Meeting(String title, LocalDateTime meetingTime) {
        this.title = title;
        this.meetingTime = meetingTime;
    }
}

출력 결과:

java.time 직렬화:
{
  "title": "팀 회의",
  "meetingTime": "2024-12-13 15:45:06"
}

역직렬화된 객체:
제목: 팀 회의
시간: 2024-12-13T15:45:06

java.time API와 통합하면 더 현대적이고 지역화된 날짜/시간 처리가 가능합니다.

참고사이트

Gson 공식 문서: https://github.com/google/gson
java.time API 문서: https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

반응형

'JAVA' 카테고리의 다른 글

[JAVA] Gson과 REST API  (0) 2024.12.15
[JAVA] Gson의 제한사항과 문제 해결  (0) 2024.12.14
[JAVA] Gson을 활용한 성능 최적화  (0) 2024.12.14
[JAVA] Gson과 JSON 파싱  (0) 2024.12.14
[JAVA] Gson의 필드 컨트롤  (0) 2024.12.14
[JAVA] Gson과 복합 객체  (0) 2024.12.14
[JAVA] Gson의 고급 기능  (1) 2024.12.14
[JAVA] Gson과 Java 컬렉션  (0) 2024.12.13