Ist es möglich, ein Feld in der Klasse zu haben, aber während der Serialisierung / Deserialisierung in der Jackson-Bibliothek unterschiedliche Namen dafür?
Zum Beispiel habe ich Klasse "Coordiantes".
class Coordinates{
int red;
}
Für die Deserialisierung von JSON möchten Sie ein Format wie das folgende haben:
{
"red":12
}
Aber wenn ich das Objekt serialisieren werde, sollte das Ergebnis wie folgt aussehen:
{
"r":12
}
Ich habe versucht, dies zu implementieren, indem ich @JsonProperty
Annotation sowohl auf Getter als auch auf Setter (mit unterschiedlichen Werten) angewendet habe:
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
aber ich habe eine Ausnahme:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Nicht erkanntes Feld "rot"
Sie können verwenden,
@jsonAlias
was in Jackson 2.9.0 eingeführt wurdeBeispiel:
Dies wird
r
während der Serialisierung verwendet, ermöglicht jedochred
als Alias während der Deserialisierung. Dies ermöglichtr
jedoch auch eine Deserialisierung.quelle
has no effect during serialization where primary name is always used
. Dies ist nicht das, was das OP will.r
als Primärname verwenden können , aberred
für den@JsonAlias
, der es ermöglicht, ihn zu serialisierenr
, aberred
bei der Deserialisierung erkannt wird. Das Kommentieren mit@JsonProperty("r")
und@JsonAlias("red")
sollte zusätzlich für das gegebene Problem gut funktionieren.Sie können eine Kombination aus @JsonSetter und @JsonGetter verwenden , um die Deserialisierung bzw. Serialisierung Ihrer Eigenschaft zu steuern. Auf diese Weise können Sie auch standardisierte Getter- und Setter-Methodennamen beibehalten, die Ihrem tatsächlichen Feldnamen entsprechen.
quelle
Ich würde zwei verschiedene Getter / Setter-Paare an eine Variable binden:
quelle
Es ist möglich, ein normales Getter / Setter-Paar zu haben. Sie müssen nur den Zugriffsmodus in angeben
@JsonProperty
Hier ist ein Unit-Test dafür:
Ich habe die Ausgabe wie folgt erhalten:
quelle
Dies war nicht das, was ich als Lösung erwartet hatte (obwohl es ein legitimer Anwendungsfall ist). Meine Anforderung bestand darin, einem vorhandenen fehlerhaften Client (einer bereits veröffentlichten mobilen App) die Verwendung alternativer Namen zu ermöglichen.
Die Lösung besteht darin, eine separate Setter-Methode wie die folgende bereitzustellen:
quelle
Ich weiß, dass es eine alte Frage ist, aber für mich hat es funktioniert, als ich herausfand, dass es mit der Gson-Bibliothek in Konflikt steht. Wenn Sie also Gson verwenden, verwenden Sie
@SerializedName("name")
anstelle der@JsonProperty("name")
Hoffnung, dass dies hilftquelle
Das
@JsonAlias
Kommentieren, mit dem Jackson 2.9+ eingeführt wurde, ohne zu erwähnen, dass@JsonProperty
das Element mit mehr als einem Alias (verschiedene Namen für eine json-Eigenschaft) deserialisiert werden soll, funktioniert einwandfrei .Ich habe
com.fasterxml.jackson.annotation.JsonAlias
für die Paketkonsistenz mitcom.fasterxml.jackson.databind.ObjectMapper
für meinen Anwendungsfall verwendet.Zum Beispiel:
funktioniert einfach gut.
quelle
Sie müssen dies als Feature aufgenommen haben, da das Festlegen eines anderen
@JsonProperty
für einen Getter und einen Setter genau das ergibt, was Sie erwarten würden (unterschiedlicher Eigenschaftsname während der Serialisierung und Deserialisierung für dasselbe Feld). Jackson Version 2.6.7quelle
Sie können dazu eine Serialisierungsklasse schreiben:
quelle