Natürlich gibt es eine automatisierte Methode namens Serialisierung und Deserialisierung, die Sie mit bestimmten Anmerkungen ( @JsonSerialize , @JsonDeserialize ) definieren können, wie auch von pb2q erwähnt.
Sie können sowohl java.util.Date als auch java.util.Calendar ... und wahrscheinlich auch JodaTime verwenden.
Die @ JsonFormat-Annotationen funktionierten bei mir nicht wie gewünscht ( die Zeitzone wurde auf einen anderen Wert eingestellt) während der Deserialisierung (die Serialisierung funktionierte perfekt):
@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")
Sie müssen einen benutzerdefinierten Serializer und einen benutzerdefinierten Deserializer anstelle der Annotation @JsonFormat verwenden, wenn Sie ein vorhergesagtes Ergebnis wünschen. Ich habe hier ein wirklich gutes Tutorial und eine Lösung gefunden http://www.baeldung.com/jackson-serialize-dates
Es gibt Beispiele für Datum Felder aber ich brauchte für Kalender Felder so hier ist meine Umsetzung :
Die Serializer- Klasse:
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()));
}
}
}
Die Deserializer- Klasse:
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);
}
}
}
und die Verwendung der oben genannten Klassen:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Unter Verwendung dieser Implementierung ergibt die Ausführung des Serialisierungs- und Deserialisierungsprozesses nacheinander den Ursprungswert.
Nur mit der Annotation @JsonFormat liefert die Deserialisierung ein anderes Ergebnis. Ich denke, aufgrund der Standardeinstellung für die interne Zeitzone der Bibliothek können Sie diese mit den Annotationsparametern nicht ändern (das war auch meine Erfahrung mit den Versionen Jackson Library 2.5.3 und 2.6.3).