So ändern Sie einen Feldnamen in JSON mit Jackson

169

Ich benutze Jackson, um ein Objekt von mir in Json umzuwandeln. Das Objekt hat 2 Felder:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

Da ich dies mit der automatischen Vervollständigungsfunktion von jQuery verwenden möchte, möchte ich, dass 'id' als 'Wert' im json und 'name' als 'label' angezeigt werden. Die Dokumentation von Jackson ist diesbezüglich nicht klar und ich habe jede Annotation ausprobiert, die auch nur aus der Ferne so aussieht, als würde sie das tun, was ich brauche, aber ich kann nicht nameso erscheinen labelund idso erscheinen wie valueim json.

Weiß jemand, wie man das macht oder ob das möglich ist?

Ali
quelle
Wenn Sie die Entität ("Stadt") jemals für einen anderen Zweck oder eine andere Geschäftslogik verwenden würden, würde ich es vermeiden, ihre JSON-Darstellung als Label & Value zu definieren. OTOH Wenn dies reine Referenzdaten sind, die für Combos verwendet werden, werden Sie wahrscheinlich mehr haben - eine generische Entität (Paar oder Option) zu erstellen, um all diese abzudecken, ist ein möglicher Ansatz, den Sie in Betracht ziehen sollten.
Thomas W

Antworten:

323

Haben Sie versucht, @JsonProperty zu verwenden?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}
henrik_lundgren
quelle
5
Ja, ich hatte das versucht, aber ich tat es @JsonProperty(value="label")und es funktionierte nicht. Ich habe es versucht, wie Sie vorgeschlagen haben, und es funktioniert! Danke Mann, das wird jetzt wirklich helfen, den Code zu vereinfachen.
Ali
Ich habe eine ähnliche Anforderung. Nur dass ich Jackson mit RESTEasy benutze und das nicht funktioniert: - / Seltsam!
Niks
Stellen Sie sicher
2
Gibt es eine Möglichkeit, Jackson (oder GSON) zu nutzen, um einen Eigenschaftsnamen in einer bereits vorhandenen JSON-Zeichenfolge zu ändern (nicht während der Serialisierung)?
Don Cheadle
Ich habe Objekt @JsonProperty ("Objekt") val jsonObject verwendet: String, ... aber fehlgeschlagen
Raju yourPepe
45

Beachten Sie, dass es org.codehaus.jackson.annotate.JsonPropertyin Jackson 1.x und com.fasterxml.jackson.annotation.JsonPropertyin Jackson 2.x gibt. Überprüfen Sie, welchen ObjectMapper Sie verwenden (ab welcher Version), und stellen Sie sicher, dass Sie die richtige Anmerkung verwenden.

m3th0dman
quelle
Es gibt auch einen org.json4s.jacksonNamespace. :) und möglicherweise andere Implementierung von jacksonYMMV.
Jesse Chisholm
14

Es gibt noch eine weitere Option zum Umbenennen des Felds:

Jackson MixIns .

Nützlich, wenn Sie sich mit Klassen von Drittanbietern befassen, die Sie nicht mit Anmerkungen versehen können , oder wenn Sie die Klasse einfach nicht mit Jackson-spezifischen Anmerkungen verschmutzen möchten.

Die Jackson-Dokumentation für Mixins ist veraltet, daher kann dieses Beispiel mehr Klarheit bieten. Im Wesentlichen: Sie erstellen eine Mixin-Klasse, die die Serialisierung wie gewünscht ausführt. Registrieren Sie es dann im ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Dimitar II
quelle
Ich bin gespannt, ob sich dies auf die Leistung beim Serialisieren / Deserialisieren von Feldern auswirkt.
Chanllen
2

Jackson

Wenn Sie Jackson verwenden, können Sie die @JsonPropertyAnnotation verwenden, um den Namen einer bestimmten JSON-Eigenschaft anzupassen.

Daher müssen Sie nur die Entitätsfelder mit der @JsonPropertyAnmerkung versehen und einen benutzerdefinierten JSON-Eigenschaftsnamen wie folgt angeben:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE oder JakartaEE JSON-B

JSON-B ist die Standardbindungsschicht zum Konvertieren von Java-Objekten in und von JSON. Wenn Sie JSON-B verwenden, können Sie den Namen der JSON-Eigenschaft über die @JsonbPropertyAnmerkung überschreiben :

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Vlad Mihalcea
quelle