Leitfaden für @JsonFormat in Jackson

Anleitung zu @JsonFormat in Jackson

1. Überblick

In diesem Artikel versuchen wir zu verstehen, wie@JsonFormat in Jackson verwendet werden. Es handelt sich um eine Jackson-Annotation, mit der angegeben wird, wie Felder und / oder Eigenschaften für die JSON-Ausgabe formatiert werden. Insbesondere können Sie mit dieser Anmerkung festlegen, wie formatiert werden soll

Insbesondere können Sie mit dieser Anmerkung angeben, wie die Werte vonDate undCalendar gemäß dem Format vonSimpleDateFormat formatiert werden sollen.

2. Maven-Abhängigkeit

@JsonFormat ist im Paketjackson-databind definiert, daher benötigen wir die folgende Maven-Abhängigkeit:


    com.fasterxml.jackson.core
    jackson-databind
    2.9.4

3. Anfangen

3.1. Verwenden des Standardformats

Zunächst werden die Konzepte zur Verwendung der Annotation@JsonFormatmit einer Klasse demonstriert, die einen Benutzer darstellt.

Da wir versuchen, die Details der Anmerkung zu erläutern, wird das ObjektUserauf Anfrage erstellt (und nicht gespeichert oder aus einer Datenbank geladen) und in JSON serialisiert:

public class User {
    private String firstName;
    private String lastName;
    private Date createdDate = new Date();

    // standard constructor, setters and getters
}

Das Erstellen und Ausführen dieses Codebeispiels gibt die folgende Ausgabe zurück:

{"firstName":"John","lastName":"Smith","createdDate":1482047026009}

Wie Sie sehen können, wird das FeldcreatedDateals Anzahl der Sekunden seit der Epoche angezeigt. Dies ist das Standardformat für die Felder vonDate.

3.2. Verwenden der Anmerkung auf einem Getter

Verwenden wir nun@JsonFormat, um das Format anzugeben, in dem das FeldcreatedDate serialisiert werden soll. Hier wird die Benutzerklasse für diese Änderung aktualisiert. Das FeldcreatedDate wurde wie gezeigt mit Anmerkungen versehen, um das Datumsformat anzugeben.

Das für das Argumentpatternverwendete Datenformat wird durchSimpleDateFormatangegeben:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ")
private Date createdDate;

Mit dieser Änderung erstellen wir das Projekt erneut und führen es aus. Die Ausgabe wird unten gezeigt:

{"firstName":"John","lastName":"Smith","createdDate":"[email protected]:53:34.740+0000"}

Wie Sie sehen können, wurde das FeldcreatedDatemit dem angegebenen FormatSimpleDateFormatund der Anmerkung@JsonFormatformatiert.

Das obige Beispiel zeigt die Verwendung der Annotation in einem Feld. Es kann auch wie folgt in einer Getter-Methode (einer Eigenschaft) verwendet werden.

Beispielsweise verfügen Sie möglicherweise über eine Eigenschaft, die beim Aufruf berechnet wird. In diesem Fall können Sie die Annotation für die Getter-Methode verwenden. Beachten Sie, dass das Muster auch geändert wurde, um nur den Datumsteil des Moments zurückzugeben:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date getCurrentDate() {
    return new Date();
}

Die resultierende Ausgabe lautet wie folgt:

{ ... , "currentDate":"2016-12-18", ...}

3.3. Festlegen des Gebietsschemas

Neben dem Datumsformat können Sie auch das Gebietsschema angeben, das für die Serialisierung verwendet werden soll. Wenn Sie diesen Parameter nicht angeben, wird die Serialisierung mit dem Standardgebietsschema ausgeführt:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ", locale = "en_GB")
public Date getCurrentDate() {
    return new Date();
}

3.4. Festlegen der Form

Die Verwendung von@JsonFormat mitshape aufJsonFormat.Shape.NUMBER führt zur Standardausgabe fürDate-Typen - als Anzahl der Sekunden seit der Epoche. Der Parameterpattern) s ist in diesem Fall nicht anwendbar und wird ignoriert:

@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
    return new Date();
}

Die Ausgabe sieht wie folgt aus:

{ ..., "dateNum":1482054723876 }

4. Fazit

Zusammenfassend wird@JsonFormat verwendet, um das Ausgabeformat der TypenDate undCalendar zu steuern, wie oben gezeigt.

Der oben gezeigte Beispielcode istover on GitHub verfügbar.