반응형
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 |