Por supuesto, hay una forma automatizada llamada serialización y deserialización y puede definirla con anotaciones específicas ( @JsonSerialize , @JsonDeserialize ) como también se menciona en pb2q.
Puede usar java.util.Date y java.util.Calendar ... y probablemente también JodaTime.
Las anotaciones @JsonFormat no funcionaron para mí como quería (ha ajustado la zona horaria a un valor diferente) durante la deserialización (la serialización funcionó a la perfección):
@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "CET")
@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Europe/Budapest")
Debe usar el serializador personalizado y el deserializador personalizado en lugar de la anotación @JsonFormat si desea un resultado previsto. He encontrado un muy buen tutorial y solución aquí http://www.baeldung.com/jackson-serialize-dates
Hay ejemplos para los campos de Fecha , pero los necesitaba para los campos de Calendario , así que aquí está mi implementación :
La clase de serializador :
public class CustomCalendarSerializer extends JsonSerializer<Calendar> {
public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public static final Locale LOCALE_HUNGARIAN = new Locale("hu", "HU");
public static final TimeZone LOCAL_TIME_ZONE = TimeZone.getTimeZone("Europe/Budapest");
@Override
public void serialize(Calendar value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
if (value == null) {
gen.writeNull();
} else {
gen.writeString(FORMATTER.format(value.getTime()));
}
}
}
La clase de deserializador :
public class CustomCalendarDeserializer extends JsonDeserializer<Calendar> {
@Override
public Calendar deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String dateAsString = jsonparser.getText();
try {
Date date = CustomCalendarSerializer.FORMATTER.parse(dateAsString);
Calendar calendar = Calendar.getInstance(
CustomCalendarSerializer.LOCAL_TIME_ZONE,
CustomCalendarSerializer.LOCALE_HUNGARIAN
);
calendar.setTime(date);
return calendar;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
y el uso de las clases anteriores:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Con esta implementación, la ejecución del proceso de serialización y deserialización da como resultado consecutivamente el valor de origen.
Solo usando la anotación @JsonFormat, la deserialización da un resultado diferente , creo que debido a la configuración predeterminada de la zona horaria interna de la biblioteca, lo que no puede cambiar con los parámetros de anotación (esa fue mi experiencia con la biblioteca Jackson 2.5.3 y la versión 2.6.3 también).