Obviamente, existe uma maneira automatizada chamada serialização e desserialização e você pode defini-la com anotações específicas ( @JsonSerialize , @JsonDeserialize ), conforme mencionado pelo pb2q.
Você pode usar java.util.Date e java.util.Calendar ... e provavelmente o JodaTime também.
As anotações @JsonFormat não funcionaram para mim como eu queria ( ajustou o fuso horário para um valor diferente) durante a desserialização (a serialização funcionou perfeitamente):
@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")
Você precisa usar o serializador personalizado e o desserializador personalizado em vez da anotação @JsonFormat, se desejar um resultado previsto. Encontrei um bom tutorial e solução aqui http://www.baeldung.com/jackson-serialize-dates
Existem exemplos para os campos Data , mas eu precisava para os campos Calendário , então aqui está minha implementação :
A classe do 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()));
}
}
}
A classe desserializador :
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);
}
}
}
e o uso das classes acima:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Usando essa implementação, a execução do processo de serialização e desserialização resulta consecutivamente no valor de origem.
Somente usando a anotação @JsonFormat, a desserialização dá um resultado diferente , acho que, devido à configuração padrão do fuso horário interno da biblioteca, o que você não pode alterar com os parâmetros de anotação (essa também foi minha experiência com as versões 2.5.3 e 2.6.3 da biblioteca Jackson).