Bien sûr. il existe un moyen automatisé appelé sérialisation et désérialisation et vous pouvez le définir avec des annotations spécifiques ( @JsonSerialize , @JsonDeserialize ) comme l'a également mentionné pb2q.
Vous pouvez utiliser à la fois java.util.Date et java.util.Calendar. ... et probablement aussi JodaTime.
Les annotations @JsonFormat n'ont pas fonctionné pour moi comme je le voulais. (il a ajusté le fuseau horaire à une valeur différente) pendant la désérialisation (la sérialisation a fonctionné parfaitement) :
@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")
Vous devez utiliser un sérialiseur et un désérialiseur personnalisés au lieu de l'annotation @JsonFormat si vous voulez un résultat prédictif. J'ai trouvé un très bon tutoriel et une bonne solution ici. http://www.baeldung.com/jackson-serialize-dates
Il existe des exemples pour Date mais j'avais besoin de Calendrier champs ainsi voici mon implémentation :
El sérialiseur classe :
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()));
}
}
}
El désérialiseur classe :
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);
}
}
}
et l'utilisation des classes ci-dessus :
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Avec cette mise en œuvre, l'exécution du processus de sérialisation et de désérialisation donne consécutivement la valeur d'origine.
En utilisant uniquement l'annotation @JsonFormat, la désérialisation donne un résultat différent. Je pense que c'est à cause de la configuration par défaut du fuseau horaire interne de la bibliothèque que vous ne pouvez pas modifier avec les paramètres d'annotation (c'est ce que j'ai constaté avec les versions 2.5.3 et 2.6.3 de la bibliothèque Jackson).