반응형
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
반응형
'back end > java' 카테고리의 다른 글
[Java] 파일, 폴더(디렉토리) 삭제하는 방법 (0) | 2023.11.09 |
---|---|
파일 조작의 새로운 길, `java.nio.file.Files` vs `java.io.File` (0) | 2023.11.09 |
자바 클래스 파일 버전 확인하는 방법 (0) | 2023.11.05 |
Spring Boot JPA에서 SQL 로그 출력하기 (0) | 2023.11.05 |
apache poi - IOException: 지정된 경로를 찾을 수 없습니다 (1) | 2023.10.04 |