java - jsonformat - ¿Cómo deserializar la fecha de JS usando Jackson?
spring jackson date format example (5)
@JsonFormat solo funciona para el formato estándar compatible con la versión de jackson que está utilizando.
Ej .: compatible con cualquiera de las formas estándar ("aaaa-MM-dd''T''HH: mm: ss.SSSZ", "aaaa-MM-dd''T''HH: mm: ss.SSS''Z ''", " EEE, dd MMM aaaa HH: mm: ss zzz "," aaaa-MM-dd ")) para jackson 2.8.6
Obtengo una cadena de fecha de ExtJS en el formato:
"2011-04-08T09: 00: 00"
cuando intento deserializar esta fecha, cambia la zona horaria a Indian Standard Time (agrega +5: 30 a la hora). Así es como estoy deserializando la fecha:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
Hacer esto tampoco cambia la zona horaria. Todavía tengo la fecha en IST:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
¿Cómo deserializo la fecha en la forma en que está llegando sin las molestias de Timezone?
Además de la respuesta de Varun Achar , esta es la variante de Java 8 que se me ocurrió, que usa java.time.LocalDate y ZonedDateTime en lugar de las antiguas clases de java.util.Date.
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);
}
}
Encontré un trabajo alternativo, pero con esto tendré que anotar el setter de cada fecha a lo largo del proyecto. ¿Hay alguna manera de especificar el formato al crear ObjectMapper?
Esto es lo que hice:
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);
}
}
}
Y anotaron el método setter de cada campo de fecha con esto:
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
Esto funciona para mí, estoy usando jackson 2.0.4
ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss");
objectMapper.setDateFormat(df);
Hay un buen blog sobre este tema: http://www.baeldung.com/jackson-serialize-dates Use @JsonFormat se ve de la manera más simple.
public class Event {
public String name;
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}