back end/java

Gson을 사용한 Java 8 LocalDateTime의 직렬화 및 역직렬화

노루아부지 2023. 11. 5. 14:17

1. 현상

JSON 데이터에는 "2014-03-10T18:46:40.000Z"와 같은 날짜 및 시간 속성이 있으며, 이를 Java 8의 LocalDateTime으로 역직렬화하려고 시도했을 때 다음과 같은 오류가 발생합니다:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING.

 

 

2. 원인

이 문제는 Gson이 JSON 문자열을 파싱하고 LocalDateTime 필드에 매핑하려고 시도할 때 발생합니다. Gson은 기본적으로 JSON 문자열을 LocalDateTime으로 변환하지 못하므로 LocalDateTime 필드가 문자열로 처리됩니다.

 

3. 해결방법

LocalDateTime과 JSON 날짜 문자열 간의 매핑을 처리하기 위해 Gson의 커스텀 직렬화 및 역직렬화 어댑터를 사용해야 합니다. 다음은 이 문제를 해결하는 방법에 대한 단계입니다:

 


1. Gson 라이브러리 및 Java 8 날짜 및 시간 라이브러리 가져오기

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

 

 

2. Gson 빌더 생성 및 LocalDateTime 형식 지정

Gson gson = new GsonBuilder()
    .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) ->
        LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")))
    .registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (localDateTime, type, jsonSerializationContext) ->
        new JsonPrimitive(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))))
    .create();

 

 

3. JSON 역직렬화 테스트

String json = "{\"myDateTime\":\"2014-03-10T18:46:40.000Z\"}";
MyClass myObject = gson.fromJson(json, MyClass.class);

 

4. JSON 직렬화 테스트

MyClass myObject = new MyClass(LocalDateTime.now());
String json = gson.toJson(myObject);
728x90
loading