# @JsonIgnore im Setter



## Encera (14. Okt 2022)

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 (14. Okt 2022)

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 (14. Okt 2022)

LimDul hat gesagt.:


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


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.

```
@JsonConverter( HashConverter.class )
    public byte[] getBlockId( )
    {
        return blockId;
    }

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

Die Block Id wird hier gesetzt:

```
or ( Transaction transaction : block.getTransactions( ) )
            {
                transaction.setBlockId( block.getBlockHash( ) );
```
Und diese wird auch korrekt im JSON-Format Repräsentiert:

Ich verstehe quasi nur nicht was mir dieses Ignore im Setter genau sagen soll


----------



## LimDul (14. Okt 2022)

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 (14. Okt 2022)

LimDul hat gesagt.:


> 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?


----------



## LimDul (14. Okt 2022)

Encera hat gesagt.:


> 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


```
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:


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


----------



## Encera (14. Okt 2022)

LimDul hat gesagt.:


> Nehmen wir mal folgende Java-Klasse
> 
> 
> ```
> ...


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 (15. Okt 2022)

Encera hat gesagt.:


> 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 (15. Okt 2022)

KonradN hat gesagt.:


> 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😅


----------

