it-swarm.com.de

Jackson überschreibt Getter nicht mit @JsonProperty

JsonProperty überschreibt nicht den Standardnamen, den jackson vom Getter erhält. Wenn ich die Klasse mit ObjectMapper und Jackson serialisiere, bekomme ich

{"hi":"hello"}

Wie Sie sehen, hat die JsonProperty-Annotation keine Auswirkungen

class JacksonTester {
    String hi;

    @JsonProperty("hello")
    public String getHi() {
        return hi;
    }
}   

Das Einfügen von @JsonProperty in den String selbst funktioniert ebenfalls nicht. Die einzige Möglichkeit, wie ich den Namen ändern kann, ist, den Getter umzubenennen. Das einzige Problem ist, dass der erste Buchstabe immer klein geschrieben wird

10
tt_Gantz

Das Problem war, dass ich sowohl die alten als auch die neuen Jackson-Bibliotheken verwendete

d. h. bevor ich __.import org.codehaus.jackson.annotate.JsonProperty; hatte, was ich unten ändern musste, um mit der verwendeten Bibliothek konsistent zu sein. 

Da ich maven verwendet habe, bedeutete dies auch das Aktualisieren meiner Abhängigkeiten von Maven .import com.fasterxml.jackson.annotation.JsonProperty;

Damit es funktioniert, brauchte ich die @JsonProperty-Annotation auf dem Getter (das Auflegen auf das Objekt funktionierte nicht).

Ich habe die Antwort hier gefunden (danke an francescoforesti) @JsonProperty funktioniert nicht wie erwartet

19
tt_Gantz

Ich weiß, es ist eine alte Frage, aber für mich hat sie funktioniert, als ich herausfand, dass sie mit der Gson-Bibliothek in Konflikt steht, und ich musste @SerializedName("name") anstelle von @JsonProperty("name") verwenden. Ich hoffe, das hilft

4
Khaled

Dieses Problem hatte ich bei der Aktualisierung von älterer Version auf FasterXML Jackson 2.8.3. 

Bei der Deserialisierung der JSON-Antwort aus unserer Datenbank in ein Java-Klassenobjekt hatte unser Code @JsonSetter nicht auf den Setters der Klasse. Bei der Serialisierung wurden bei der Ausgabe die Java-Klassenobjekte der Klasse nicht in JSON serialisiert, sodass der @JsonProperty()-Dekorator nicht wirksam wurde. 

Ich habe das Problem behoben, indem ich der Setter-Methode für diese Eigenschaft @JsonSetter("name-from-db") hinzugefügt habe. 

Um Eigenschaften mit der Getter-Methode umzubenennen, können Sie anstelle von @JsonProperty() auch @JsonGetter() verwenden. 

Hier ist unser Code:

public class KwdGroup {
    private String kwdGroupType;

    // Return "type" instead of "kwd-group-type" in REST API response
    @JsonGetter("type") // Can use @JsonProperty("type") as well
    public String getKwdGroupType() {
        return kwdTypeMap.get(kwdGroupType);
    }

    @JsonSetter("kwd-group-type") // "kwd-group-type" is what JSON from the DB API outputs for code to consume 
    public void setKwdGroupType(String kwdGroupType) {
        this.kwdGroupType = kwdGroupType;
    }
}
3
Xchai

Bei Verwendung von Kotlin

Ich verstehe, dass die ursprüngliche Frage in Java ist, aber da Kotlin sehr populär wird und viele es verwenden, möchte ich dies hier posten, um anderen zu helfen.

Wie auch immer, für Kotlin, da, wie Getter/Setter funktionieren, wenn Sie val verwenden, was bedeutet, dass Sie nur den Getter verfügbar machen, müssen Sie die Annotation möglicherweise wie folgt auf den Getter anwenden:

class JacksonTester(@get:JsonProperty("hello") val hi: String)

2
Francisco C.

Ich hatte das gleiche Problem

Sie müssen nur Import Import com.fasterxml.jackson.annotation.JsonProperty; Auf Import org.codehaus.jackson.annotate.JsonProperty;

1
Dmitriy S

Kamelfälle scheinen immer noch Probleme zu haben, selbst nachdem Sie die richtigen Anmerkungen definiert haben.

@JsonProperty ("mirrorport") private String mirrorPort;

Deserialisierung schlägt immer noch fehl, wenn XML <mirrorport>YES</mirrorport> hat

1
gpushkas

Hast du es unten versucht? 

class JacksonTester {
    private String hi;

    @JsonProperty("hello")
    public String getHi() {
        return hi;
    }
}   

Ich meine, die Variablendeklaration 'hi' sollte als privat definiert werden. Alternativ können Sie auch einen @JsonIgnore für die Variablendeklaration verwenden, falls Sie sie lieber im Standardbereich behalten möchten.

0
vvs

Ich habe die Datenbankabhängigkeit vermisst 

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${fasterxml.version}</version>
</dependency>
0
Ketan Keshri

Ich habe kürzlich eine andere interessante Wendung in dieser Frage gefunden. Wir haben begonnen, das Hibernate5Module zu verwenden, um bei einigen problematischen Ladeproblemen zu helfen. Darüber hinaus verwenden wir Groovy, um nicht Getter und Setter zu definieren.

Es stellt sich heraus, dass das Hibernate-Modul die Annotation @JsonProperty zu stören scheint. Insbesondere, wenn Sie etwas mit @Transient kommentiert haben. Wenn Sie also Folgendes haben:

@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property

Die Variable alternateName wird im JSON nicht angezeigt. Außerdem werden Ihre Kunden wahrscheinlich Probleme mit ihren POSTs und PUTs haben! Um dies zu beheben, können Sie eine einfache Problemumgehung verwenden. Definieren Sie die Getter und Setter für den zu verwendenden internen Namen (*), und verwenden Sie das value-Attribut nicht für @JsonProperty.

@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName

void setProperty(String property) {
    this.alternateName = property
}

@JsonIgnore
String getProperty() {
    this.alternateName
}

Beachten Sie die Verwendung von @JsonIgnore auf dem Getter. Wenn Sie dies nicht tun, wird Ihr Framework es wahrscheinlich abholen und Sie haben doppelte Einträge für dasselbe in Ihrem JSON.

Wie auch immer - ich hoffe, das hilft jemandem!

(*) Wir haben versucht, sich an eine bestimmte Schnittstelle zu halten und den Namen intern durchzusetzen. Die offengelegte API benötigte jedoch einen anderen, benutzerfreundlichen Namen.

0

Platziere es auf die Variable, nicht auf den Getter

class JacksonTester {
    @JsonProperty("hello")
    private String hi;

    public String getHi() {
        return hi;
    }
} 
0
mprivat