웹 개발

Jackson Convert Object to Map preserving Date type

노루아부지 2021. 8. 7. 01:17

Jackson ObjectMapper을 이용하여 Object(VO, DTO 등)를 Map으로 값을 복사할 때 그중 날짜 형태의 데이터(java.util.Date나 java.util.LocalDateTime 등)가 포함되어 있다면 그 값이 우리가 알고 있는 yyyy-MM-dd(2021-01-01)이 아니라, Long 형태의 값으로 Map에 들어가게 됩니다.

 

먼저, 테스트를 위한 Book 클래스 입니다.

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.Date;

@Getter
@Setter
public class Book {
  private LocalDateTime datetime;
  private Date date;
}

 

아래의 코드를 실행하면 날짜가 Long형태로 표시됩니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;

public class Test {
  public static void main(String[] args) {
    Book book = new Book();
    book.setDate(new Date());
    book.setDatetime(LocalDateTime.now());

    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = mapper.convertValue(book, Map.class);

    System.out.println("date : " + map.get("date"));
    System.out.println("localDatetime : " + map.get("date"));
  }
}

 

이럴 때, 아래 코드와 같이 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 를 사용하면 우리가 알고 있는 시간 형태로 변환 가능합니다.

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

 

아래는 전체 코드입니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;

public class Test {
  public static void main(String[] args) {
    Book book = new Book();
    book.setDate(new Date());
    book.setDatetime(LocalDateTime.now());

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    Map<String, Object> map = mapper.convertValue(book, Map.class);

    System.out.println("date : " + map.get("date"));
    System.out.println("localDatetime : " + map.get("date"));
  }
}

 

아래는 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS를 추가한 결과입니다.

date : 2021-08-06T15:53:13.480+0000
localDatetime : 2021-08-06T15:53:13.480+0000

 

만약, 위의 format 말고 지정한 format으로 변경하고 싶을 경우 다음과 같이 setDateFormat() 메서드를 이용하면 됩니다.

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(df);

 

아래는 전체 코드입니다.

import com.fasterxml.jackson.databind.ObjectMapper;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;

public class Test {
  public static void main(String[] args) {
    Book book = new Book();
    book.setDate(new Date());
    book.setDatetime(LocalDateTime.now());

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(df);
    Map<String, Object> map = mapper.convertValue(book, Map.class);

    System.out.println("date : " + map.get("date"));
    System.out.println("localDatetime : " + map.get("date"));
  }
}

 

아래는 출력 결과입니다.

date : 2021-08-07 01:12:07
localDatetime : 2021-08-07 01:12:07

 

 

 

 

 

[참고 사이트]

https://stackoverflow.com/questions/26071530/jackson-convert-object-to-map-preserving-date-type

 

Jackson Convert Object to Map preserving Date type

I am using Jackson ObjectMapper to convert a Java Bean to a Map. However, it is not preserving the Date object, rather it gets converted to Long. Here is the failing test case, @Test public void

stackoverflow.com

https://www.baeldung.com/jackson-serialize-dates

 

728x90
loading