안녕하세요. 자바가 java.time 패키지를 제공하면서, 기존 Date 객체에 비하여 개발이 편해졌습니다. LocalDate를 json으로 변환하여 사용할때 만나는 문제를 다뤄보겠습니다.
jackson 라이브러리를 사용하여 json으로 변환하고 다시 읽어 보겠습니다.
jackson 라이브러리 json 변환 예제1
@Test
public void objectMapper() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
LocalDate ld = LocalDate.now();
String json = objectMapper.writeValueAsString(ld);
System.out.println("json == " + json);
LocalDate ldFromJson = objectMapper.readValue(json, LocalDate.class);
System.out.println("ld1 == " + ld);
System.out.println("ld2 == " + ldFromJson);
}
실행 결과1
json으로 변환할때 LocalDate의 모든 속성이 그대로 변환된 것을 볼 수 있습니다.
이경우 serializer, deserializer를 구현하여 형식을 정할 수 있습니다.
jackson 라이브러리 json 변환 예제2
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;ㅇ
@Test
public void registerModule() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
simpleModule.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));
objectMapper.registerModule(simpleModule);
LocalDate ld = LocalDate.now();
String json = objectMapper.writeValueAsString(ld);
System.out.println("json == " + json);
LocalDate ldFromJson = objectMapper.readValue(json, LocalDate.class);
System.out.println("ld1 == " + ld);
System.out.println("ld2 == " + ldFromJson);
}
실행 결과2
json == "2022-06-22"
ld1 == 2022-06-22
ld2 == 2022-06-22
json으로 변환할때, ISO_LOCAL_DATE 형식의 문자열로 변환 되었습니다. 쓰고 다시 읽는 것도 정상 실행 되었습니다.
구글에서 만든 gson을 이용하는 경우 더 쉽게 사용할 수 있습니다.
gson 예제
@Test
public void gson() {
Gson gson = new Gson();
LocalDate ld = LocalDate.now();
String json = gson.toJson(ld);
System.out.println("json == " + json);
LocalDate ldFromJson = gson.fromJson(json, LocalDate.class);
System.out.println("ld1 == " + ld);
System.out.println("ld2 == " + ldFromJson);
}
실행 결과3
json == {"year":2022,"month":6,"day":22}
ld1 == 2022-06-22
ld2 == 2022-06-22
오류 없이 잘 실행 되었습니다.
앞으로 자바에서 시간관련 패키지를 다룰때 문제 없기 바랍니다.
댓글
댓글 쓰기