446 Stimmen

Nur Verwendung von @JsonIgnore bei der Serialisierung, aber nicht bei der Deserialisierung

Ich habe ein Benutzerobjekt, das zum und vom Server gesendet wird. Wenn ich das Benutzerobjekt versende, möchte ich das gehashte Kennwort nicht an den Client senden. Ich habe also hinzugefügt @JsonIgnore auf die Kennworteigenschaft, aber dies verhindert auch, dass es in das Kennwort deserialisiert wird, was es schwierig macht, Benutzer anzumelden, wenn sie kein Kennwort haben.

Wie kann ich nur @JsonIgnore auf die Serialisierung und nicht auf die Deserialisierung anzuwenden? Ich verwende Spring JSONView, also habe ich keine große Kontrolle über die ObjectMapper .

Dinge, die ich ausprobiert habe:

  1. hinzufügen @JsonIgnore zum Grundstück
  2. hinzufügen @JsonIgnore nur bei der Getter-Methode

672voto

pb2q Punkte 56919

Wie Sie das genau machen, hängt von der Version von Jackson ab, die Sie verwenden. Das hat sich mit der Version 1.9 , vorher könnten Sie dies tun, indem Sie Folgendes hinzufügen @JsonIgnore an den Getter.

Die Sie ausprobiert haben:

@JsonIgnore nur für die Getter-Methode hinzufügen

Tun Sie dies, und auch einen bestimmten @JsonProperty Annotation für den Namen Ihres JSON-Feldes "password" an die Setter-Methode für das Kennwort auf Ihrem Objekt.

Neuere Versionen von Jackson haben Folgendes hinzugefügt READ_ONLY y WRITE_ONLY Annotationsargumente für JsonProperty . Sie könnten also auch etwas tun wie:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

Die Dokumente finden Sie hier .

117voto

Um dies zu erreichen, benötigen wir lediglich zwei Anmerkungen:

  1. @JsonIgnore
  2. @JsonProperty

Verwenden Sie @JsonIgnore für das Klassenmitglied und seinen Getter und @JsonProperty auf seinem Setter. Eine Beispielabbildung würde dabei helfen:

class User {

    // More fields here
    @JsonIgnore
    private String password;

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty
    public void setPassword(final String password) {
        this.password = password;
    }
}

108voto

Daniel Beer Punkte 1579

Seit Version 2.6: Ein intuitiverer Weg ist die Verwendung der Option com.fasterxml.jackson.annotation.JsonProperty Vermerk auf dem Feld:

@JsonProperty(access = Access.WRITE_ONLY)
private String myField;

Auch wenn ein Getter vorhanden ist, wird der Feldwert von der Serialisierung ausgeschlossen.

JavaDoc sagt:

/**
 * Access setting that means that the property may only be written (set)
 * for deserialization,
 * but will not be read (get) on serialization, that is, the value of the property
 * is not included in serialization.
 */
WRITE_ONLY

Falls Sie es andersherum brauchen, verwenden Sie einfach Access.READ_ONLY .

17voto

Alex Beardsley Punkte 20500

In meinem Fall habe ich Jackson, der automatisch Objekte (de)serialisiert, die ich von einem Spring MVC-Controller zurückgebe (ich verwende @RestController mit Spring 4.1.6). Ich musste com.fasterxml.jackson.annotation.JsonIgnore anstelle von org.codehaus.jackson.annotate.JsonIgnore denn sonst hat es einfach nichts gebracht.

8voto

Dhandley Punkte 61

Eine andere einfache Möglichkeit, dies zu handhaben, ist die Verwendung des Arguments allowSetters=true in der Bemerkung. Dadurch kann das Kennwort in Ihr dto deserialisiert werden, aber es wird nicht in einen Antwortkörper serialisiert, der contains object verwendet.

Beispiel:

@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
    String foo;
    String bar;
}

Beide foo y bar werden in das Objekt eingefügt, aber nur foo wird in einen Antwortkörper geschrieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X