Nice programing

Jackson을 사용하여 JS 날짜를 역 직렬화하는 방법은 무엇입니까?

nicepro 2020. 11. 9. 20:58
반응형

Jackson을 사용하여 JS 날짜를 역 직렬화하는 방법은 무엇입니까?


ExtJS에서 다음 형식으로 날짜 문자열을 얻습니다.

"2011-04-08T09 : 00 : 00"

이 날짜를 역 직렬화하려고하면 시간대가 인도 표준시로 변경됩니다 (시간에 +5 : 30 추가). 이것이 내가 날짜를 역 직렬화하는 방법입니다.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

이렇게해도 시간대가 변경되지 않습니다. 나는 여전히 IST에서 날짜를 얻습니다.

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

시간대의 번거 로움없이 날짜가 오는 방식으로 어떻게 deserialize합니까?


해결 방법을 찾았지만이를 통해 프로젝트 전체에 걸쳐 각 날짜의 setter에 주석을 달아야합니다. ObjectMapper를 만드는 동안 형식을 지정할 수있는 방법이 있습니까?

내가 한 일은 다음과 같습니다.

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

각 날짜 필드의 setter 메서드에 다음과 같이 주석을 달았습니다.

@JsonDeserialize(using = CustomJsonDateDeserializer.class)

이것은 나를 위해 작동합니다-나는 jackson 2.0.4를 사용하고 있습니다.

ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);

이 주제에 대한 좋은 블로그가 있습니다. http://www.baeldung.com/jackson-serialize-dates @JsonFormat 사용이 가장 간단한 방법입니다.

public class Event {
    public String name;

    @JsonFormat
      (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    public Date eventDate;
}

Varun Achar의 대답 외에도 이것은 이전 java.util.Date 클래스 대신 java.time.LocalDate 및 ZonedDateTime을 사용하는 Java 8 변형입니다.

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException {

        String string = jsonparser.getText();

        if(string.length() > 20) {
            ZonedDateTime zonedDateTime = ZonedDateTime.parse(string);
            return zonedDateTime.toLocalDate();
        }

        return LocalDate.parse(string);
    }
  }

@JsonFormat은 사용중인 jackson 버전에서 지원하는 표준 형식에서만 작동합니다.

예 :-모든 표준 형식 ( "yyyy-MM-dd'T'HH : mm : ss.SSSZ", "yyyy-MM-dd'T'HH : mm : ss.SSS'Z '", " EEE, dd MMM yyyy HH : mm : ss zzz ","yyyy-MM-dd ")) for jackson 2.8.6

참고 URL : https://stackoverflow.com/questions/5591967/how-to-deserialize-js-date-using-jackson

반응형