@JsonIgnore im Setter

Encera

Aktives Mitglied
Hallo zusammen,
ich habe eine kurze Frage zu der Annotation @JsonIgnore. Konkret geht es mir darum, was es bedeutet wenn ein Setter damit versehen wird.
Mir ist klar dass Getter welche damit annotiert sind von JSON Ignoriert werden und damit nicht in der Repräsentation berücksichtigt werden. Aber wie verhält es sich quasi "andersrum"?

lg.~
 

LimDul

Top Contributor
Gute Idee ist bei sowas mal in die offizielle Doku zu schauen: https://fasterxml.github.io/jackson.../fasterxml/jackson/annotation/JsonIgnore.html

In addition, starting with Jackson 1.9, if this is the only annotation associated with a property, it will also cause cause the whole property to be ignored: that is, if setter has this annotation and getter has no annotations, getter is also effectively ignored. It is still possible for different accessors to use different annotations; so if only "getter" is to be ignored, other accessors (setter or field) would need explicit annotation to prevent ignoral (usually JsonProperty).
 

Encera

Aktives Mitglied
Hab mir das mal durchgelesen aber bei mir hat der Getter bereits eine andere Notation um das byte[] lesbarer darzustellen. Dementsprechend wird er ja laut der Erklärung in der Dokumentation nicht ignorier nur weil der setter mit @JsonIgnore versehen ist wenn ich das richtig verstehe.
Java:
@JsonConverter( HashConverter.class )
    public byte[] getBlockId( )
    {
        return blockId;
    }

    @JsonIgnore
    public void setBlockId( byte[] blockId )
    {
        this.blockId = blockId;
    }

Die Block Id wird hier gesetzt:
Code:
or ( Transaction transaction : block.getTransactions( ) )
            {
                transaction.setBlockId( block.getBlockHash( ) );
Und diese wird auch korrekt im JSON-Format Repräsentiert:
JSON.PNG
Ich verstehe quasi nur nicht was mir dieses Ignore im Setter genau sagen soll
 

LimDul

Top Contributor
Bei Java => JSON wird der Getter benötigt => Attribut kommt mit
Bei JSON => Java wird der Setter benötigt => Attribut sollte nicht mitkommen nach meinem Verständnis.

Sprich, wenn du das JSON wieder in die Java Klasse umwandelst, sollte das Attribut ignoriert werden.
 

Encera

Aktives Mitglied
Bei Java => JSON wird der Getter benötigt => Attribut kommt mit
Bei JSON => Java wird der Setter benötigt => Attribut sollte nicht mitkommen nach meinem Verständnis.

Sprich, wenn du das JSON wieder in die Java Klasse umwandelst, sollte das Attribut ignoriert werden.
Ja das würde so Sinn machen. Ich verstehe aber trotzdem noch nicht was das ganze auf mein Beispiel bezogen bedeutet da dies in meinem Buch auch nicht sonderlich genau beschrieben ist. Aber das ist dann wohl eine Anwendungsspezifische Frage und nicht so sehr auf JSON selbst bezogen denke ich

Update: Hab gerade auf StackOverFlow nachgelesen und da hatte jemand einen ähnlichen Fall. Der meinte er möchte mit JSON Ignore ein Attribut nur bei der Deserialisierung ignorieren um Usereingaben damit zu verhindern. So ähnlich steht es in meinem Buch auch drinnen aber inwiefern verhindere ich diese damit?
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Update: Hab gerade auf StackOverFlow nachgelesen und da hatte jemand einen ähnlichen Fall. Der meinte er möchte mit JSON Ignore ein Attribut nur bei der Deserialisierung ignorieren um Usereingaben damit zu verhindern. So ähnlich steht es in meinem Buch auch drinnen aber inwiefern verhindere ich diese damit?
Nehmen wir mal folgende Java-Klasse

Java:
public class ArtikelInfo {
private String name;
private String preis;

@JsonProperty
public String getPreis() {
return preis;
}

@JsonIgnore
public String setPreis(String preis) {
this.preis = preis;
}

Das Json wird genutzt um den Preis eines Artikels nach außen zu geben, als auch die Anfrage nach einem Preis zu stellen.

Wenn man eine Anfrage stellt, soll der Aufrufen keinen Preis mitgeben können - nicht dass irgendwo der Code den Preis aus versehen übernimmt. Das heißt, wenn der Client folgendes Json sendet:

Code:
{ "name":"Juwelenkette", "preis":"1 EUR"}
Wird trotzdem beim deserialisieren nur die Variable Name gesetzt, die Variable preis bleibt null.
 

Encera

Aktives Mitglied
Nehmen wir mal folgende Java-Klasse

Java:
public class ArtikelInfo {
private String name;
private String preis;

@JsonProperty
public String getPreis() {
return preis;
}

@JsonIgnore
public String setPreis(String preis) {
this.preis = preis;
}

Das Json wird genutzt um den Preis eines Artikels nach außen zu geben, als auch die Anfrage nach einem Preis zu stellen.

Wenn man eine Anfrage stellt, soll der Aufrufen keinen Preis mitgeben können - nicht dass irgendwo der Code den Preis aus versehen übernimmt. Das heißt, wenn der Client folgendes Json sendet:

Code:
{ "name":"Juwelenkette", "preis":"1 EUR"}
Wird trotzdem beim deserialisieren nur die Variable Name gesetzt, die Variable preis bleibt null.
Heißt das dann aber auch dass der Empfänger den Preis garnicht weiß da dieser ja beim deserialisieren null ist?
Ich glaub ich steh da noch irgendwo aufm Schlauch
 

KonradN

Super-Moderator
Mitarbeiter
Heißt das dann aber auch dass der Empfänger den Preis garnicht weiß da dieser ja beim deserialisieren null ist?
Fast: Beim deserialisieren ist dieser gar nicht vorhanden.
null würde bedeuten, dass da im Objekt etwas wie "preis": null auftauchen würde. Aber da es nicht serialisiert wird, würde dies einfach nicht auftauchen.

Edit: Quotes fehlten bei dem Beispiel bei preis.
 

Encera

Aktives Mitglied
Fast: Beim deserialisieren ist dieser gar nicht vorhanden.
null würde bedeuten, dass da im Objekt etwas wie "preis": null auftauchen würde. Aber da es nicht serialisiert wird, würde dies einfach nicht auftauchen.

Edit: Quotes fehlten bei dem Beispiel bei preis.
Ahh interessant, dann weiß ich jetz zumindest was die Annotation beim setter genau bedeutet, danke an euch zwei. Jetz muss ich nur noch grübeln wieso das auf das spezielle Beispiel angewendet wird weil den Grund dafür erkenne ich immernoch nicht😅
 

Neue Themen


Oben