Naturalmente c'è un modo automatizzato chiamato serializzazione e deserializzazione e si può definire con annotazioni specifiche (@JsonSerialize, @JsonDeserialize) Come indicato da pb2q pure.
È possibile utilizzare sia java.util.Date sia java.util.Calendar ... e probabilmente anche JodaTime.
Le annotazioni @JsonFormat non ha funzionato per me come volevo (è regolato il fuso orario di valore diverso) durante la deserializzazione (la serializzazione ha funzionato perfettamente):
@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")
È necessario per utilizzare il serializzatore personalizzato e il deserializzatore personalizzato invece dell'annotazione @JsonFormat se si desidera un risultato previsto. Ho trovato vero buon tutorial e la soluzione qui http://www.baeldung.com/jackson-serialize-dates
Ci sono esempi per Data campi, ma mi serviva per Calendario campi in modo qui è la mia realizzazione:
Il serializzatore 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()));
}
}
}
Il deserializzatore c lass:
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 l'utilizzo delle classi sopra:
public class CalendarEntry {
@JsonSerialize(using = CustomCalendarSerializer.class)
@JsonDeserialize(using = CustomCalendarDeserializer.class)
private Calendar calendar;
// ... additional things ...
}
Utilizzando questa implementazione l'esecuzione del processo di serializzazione e deserializzazione risultati consecutivamente il valore origine.
Solo utilizzando l'annotazione @JsonFormat la deserializzazione dà risultati diversi Credo che a causa della configurazione di default fuso orario interno biblioteca ciò che non si può cambiare con i parametri di annotazione (che era la mia esperienza con Jackson biblioteca 2.5.3 e 2.6. 3 versione pure).
Il formato 12 ore è migliore se il formato include anche la designazione AM/PM: DateFormat df = new SimpleDateFormat ("aaaa-MM-gg hh: mm a z"); –
Provato tutte queste soluzioni ma non è stato in grado di memorizzare una variabile Data del mio POJO in un valore chiave Mappa, anche come Data. Desidero quindi creare un'istanza di BasicDbObject (MongoDB API) dalla mappa e di conseguenza memorizzare la variabile in una raccolta DB MongoDB come Date (non come Long o String). È possibile? Grazie – RedEagle
È altrettanto facile usare Java 8 'LocalDateTime' o' ZonedDateTime' invece di 'Date'? Dato che 'Date' è fondamentalmente deprecato (o almeno molti dei suoi metodi), vorrei usare quelle alternative. – houcros