ObjectMapper (Jackson) 커스텀 직렬화, 역직렬화
ObjectMapper
는 객체를 잘 직렬화해서 JSON 문자열로 만들어주거나, JSON 문자열을 잘 파싱해서 객체로 만들어준다.
그런데 사용자 정의 객체의 경우엔, 개발자가 직접 직렬화, 역직렬화 시켜줄 필요가 있다.
이럴 때 어떻게 확장할 수 있을까?
다음과 같은 코드로 확장하면 된다.
@Bean
public ObjectMapper objectMapper() {
SimpleModule module = new SimpleModule();
module.addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());
module.addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
/**
* ObjectMapper 에 이 Serializer 를 등록하면,
* LocalDateTime 을 직렬화할 때 아래의 방식을 이용한다.
*/
public static DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
static class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(formatter.format(value));
}
}
/**
* ObjectMapper 에 이 Deserializer 를 등록하면,
* LocalDateTime 을 역직렬화할 때 아래의 방식을 이용한다.
*/
static class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
ObjectCodec codec = p.getCodec();
JsonNode node = codec.readTree(p);
return LocalDateTime.parse(node.asText(), formatter);
}
}
- 간단하게 LocalDateTime 을 직렬화, 역직렬화 하는 예제이다.
ObjectMapper
를 빈으로 올려, 싱글톤으로 이용하면 편리하다.
레퍼런스
https://www.baeldung.com/jackson-deserialization
https://github.com/HomoEfficio/dev-tips/blob/master/Java8-LocalDateTime-Jackson-%EC%A7%81%EB%A0%AC%ED%99%94-%EB%AC%B8%EC%A0%9C.md
반응형
'Java > 자바 잡지식' 카테고리의 다른 글
자바에서 상속이 갖는 단점들 (0) | 2023.02.22 |
---|---|
로컬과 운영 환경의 log4j 나누기 (0) | 2022.12.28 |
자바 8 이상에서 날짜 올바르게 다루기 (0) | 2022.05.19 |
javadoc 한글 깨짐 문제 해결 (0) | 2022.05.15 |
Filter, Interceptor, AOP 알아보기 (0) | 2022.05.10 |