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();
이렇게 사용해주면 된다.
-> 숫자로 변환될 객체가 long 또는 double 타입으로 변환될 수 있을 때 해당 타입으로 변환 시킨다.
-> 숫자로 변환될 객체가 정수형이거나 실수형으로 안전하게 변환될 수 있는 경우 최대한 정확한 타입으로 변환하는 것을 의미한다.
이거 사용안하면 숫자뒤에 자꾸 .0 같은 소수점이 붙는다
JSON 데이터를 보기 좋게 정렬하고 들여쓰기하는 기능을 설정하는 메서드다.
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);
이런식으로 사용하면 된다고 한다.