Wie setzen format-string für java.Zeit.Instant mit objectMapper?
Habe ich eine Entität mit java.time.Instant
für erstellte Datenfeld:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
private String id;
private String url;
private Instant createdDate;
}
Ich bin mit com.fasterxml.jackson.databind.ObjectMapper
zu sparen Element Elasticsearch als JSON:
bulkRequestBody.append(objectMapper.writeValueAsString(item));
ObjectMapper
serialisiert dieses Feld als Objekt:
"createdDate": {
"epochSecond": 1502643595,
"nano": 466000000
}
Ich habe versucht die Anmerkungen @JsonFormat(shape = JsonFormat.Shape.STRING)
aber es funktioniert nicht für mich.
Meine Frage ist wie könnte ich dies serialisieren Feld als 2010-05-30 22:15:52
string?
github.com/FasterXML/jackson-modules-java8/tree/master/datetime
Danke für die Antwort, ich habe
Haben Sie das Modul jar Datei in den classpath?
Sicher,
Danke für die Antwort, ich habe
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
und objectMapper.findAndRegisterModules()
Es funktioniert nicht für mich.Haben Sie das Modul jar Datei in den classpath?
Sicher,
compile group: 'com.fasterxml.jackson.module', name: 'jackson-modules-java8', version: '2.9.0', ext: 'pom'
diese eineInformationsquelleAutor Uladzislau Kaminski | 2017-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Lösung ist die Verwendung jackson-Module-java8. Dann können Sie fügen Sie ein
JavaTimeModule
um Ihr Objekt-mapper:Standardmäßig die
Instant
serialisiert wird als epoch-Wert (Sekunden und Nanosekunden in eine einzelne Zahl):Können Sie ändern, indem Sie die Einstellung in der Objekt-mapper:
Dies erzeugt die Ausgabe:
Beiden oben genannten Formaten sind deserialisiert ohne zusätzliche Konfiguration.
Ändern die Serialisierungs-format, fügen Sie einfach eine
JsonFormat
Anmerkung zum Feld:Müssen Sie die Zeitzone setzen, da sonst die
Instant
können nicht serialisiert werden, richtig (es gibt eine Ausnahme). Der Ausgang wird sein:Andere alternative, wenn Sie nicht wollen (oder können nicht) verwenden java8-Module, ist erstellen Sie eine benutzerdefinierte serializer und deserializer, mit einem
java.time.format.DateTimeFormatter
:Dann Sie versehen Sie das Feld mit benutzerdefinierten Klassen:
Ist die Ausgabe:
Ein detail ist, dass in der serialisierten Zeichenfolge, die Sie sind, verwirft den Bruchteil der Sekunde (alles nach dem Komma). Also, wenn Deserialisieren, diese Informationen können nicht wiederhergestellt werden (es werden auf null gesetzt).
In das Beispiel oben wurde das ursprüngliche
Instant
ist2017-08-14T12:17:47.720Z
, aber die serialisierte Zeichenfolge ist2017-08-14 12:17:47
(ohne den Bruchteil von Sekunden), so dass, wenn deserialisiert die daraus resultierendenInstant
ist2017-08-14T12:17:47Z
(die.720
Millisekunden verloren).Einfach und auf den Punkt. Jeder Fall abgedeckt.
InformationsquelleAutor
Müssen Sie unten Abhängigkeit
Und dann registrieren Sie die Module wie folgt :
schau mal hier: baeldung.com/jackson-serialize-dates
InformationsquelleAutor dassum
Für diejenigen, die zum analysieren von Java-8-Zeitstempel. Sie benötigen eine aktuelle version von
jackson-datatype-jsr310
in Ihre POM und habe Folgendes Modul eingetragen:Diesen code zu testen
InformationsquelleAutor UltimaWeapon
Hier einige Kotlin-code zu formatieren
Instant
, so enthält es keine Millisekunden verwenden, können Sie benutzerdefinierte Datums-formatterInformationsquelleAutor ZZ 5
In meinem Fall war es genug, um zu registrieren, JavaTimeModule:
In das event-Objekt habe ich ein Feld vom Typ Instant.
In der Deserialisierung müssen Sie auch, um registrieren Sie die java-Zeit Modul:
InformationsquelleAutor Laura Liparulo