LocalDate Gson, jackson

김나우·2023년 6월 1일
0

Gson

Gson 라이브러리를 사용해서 json을 파싱할 때

LocalDate가 이상하게 보였다

"schedule": {
        "startDate": {
          "year": 2023.0,
          "month": 5.0,
          "day": 11.0
        },
        "endDate": {
          "year": 2023.0,
          "month": 5.0,
          "day": 31.0
        },
      },

이런식으로 가져와 졌지만

"schedule": {
          "startDate": "2023-05-02",
        },

이런식으로 사용하고 싶었다.

그래서 Gson을 사용할 때 해결방법은 LocalDate객체를 JSON형식으로 직렬/역직렬화 하기 위한
클래스를 만들었다.

public class LocalDateDeserializerUtil implements JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        return LocalDate.parse(json.getAsString(),
                DateTimeFormatter.ofPattern("yyyy-MM-dd").withLocale(Locale.KOREA));
    }

}

public class LocalDateSerializerUtil implements JsonSerializer<LocalDate> {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Override
    public JsonElement serialize(LocalDate localDate, Type srcType, JsonSerializationContext context) {
        return new JsonPrimitive(formatter.format(localDate));
    }
}

이렇게 클래스를 만들어 주고

Gson gson = new GsonBuilder()
                .registerTypeAdapter(LocalDate.class, new LocalDateDeserializerUtil())
                .registerTypeAdapter(LocalDate.class, new LocalDateSerializerUtil())
                .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
                .setPrettyPrinting()
                .create();

이렇게 사용해주면 된다.

setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)

-> 숫자로 변환될 객체가 long 또는 double 타입으로 변환될 수 있을 때 해당 타입으로 변환 시킨다.

-> 숫자로 변환될 객체가 정수형이거나 실수형으로 안전하게 변환될 수 있는 경우 최대한 정확한 타입으로 변환하는 것을 의미한다.

이거 사용안하면 숫자뒤에 자꾸 .0 같은 소수점이 붙는다

setPrettyPrinting()

JSON 데이터를 보기 좋게 정렬하고 들여쓰기하는 기능을 설정하는 메서드다.

jackson

jackson라이브러리를 사용한다면?

 @JsonFormat(pattern = "yyyy-MM-dd")
 @Column(name = "START_DATE")
 private LocalDate startDate;

이런식으로 JsonFormat 어노테이션을 사용해주고

  ObjectMapper objectMapper = new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .enable(SerializationFeature.INDENT_OUTPUT);

        String json = objectMapper.writeValueAsString(dtos);
        myDto obj = objectMapper.readValue(json, myDto.class);

이런식으로 사용하면 된다고 한다.

profile
안녕하세요

0개의 댓글