Comment changer un nom de champ dans JSON à l'aide de Jackson

169

J'utilise jackson pour convertir un de mes objets en json. L'objet a 2 champs:

@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; }
}

Puisque je veux l'utiliser avec la fonction de saisie semi-automatique de jQuery, je veux que «id» apparaisse comme «valeur» dans le json et «nom» pour apparaître comme «étiquette». La documentation de jackson n'est pas claire à ce sujet et j'ai essayé toutes les annotations qui, même à distance, semblent faire ce dont j'ai besoin, mais je ne parviens pas nameà apparaître labelet idà apparaître comme valuedans le json.

Est-ce que quelqu'un sait comment faire cela ou si cela est possible?

Ali
la source
si jamais vous deviez potentiellement utiliser l'entité ("City") à d'autres fins ou pour toute autre logique métier, j'éviterais de définir sa représentation JSON comme Label & Value. OTOH s'il ne s'agit que de données de référence utilisées pour les combos, vous en aurez probablement plus - créer une entité générique (paire ou option) pour couvrir tous ces éléments est une approche possible à envisager.
Thomas W

Réponses:

323

Avez-vous essayé d'utiliser @JsonProperty?

@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
la source
5
Oui, j'avais essayé cela, mais je faisais @JsonProperty(value="label")et cela ne fonctionnait pas, je l'ai essayé comme vous l'avez suggéré et cela fonctionne! merci mec cela aidera vraiment à simplifier le code maintenant.
Ali le
J'ai une exigence similaire. Juste que j'utilise Jackson avec RESTEasy et que cela ne fonctionne pas: - / Strange!
Niks
vérifier que Jackson est vraiment le fournisseur configuré et pas autre chose
henrik_lundgren
2
existe-t-il un moyen d'exploiter Jackson (ou GSON) pour modifier un nom de propriété dans une chaîne JSON déjà existante (pas pendant la sérialisation)?
Don Cheadle
J'ai utilisé l'objet @JsonProperty ("object") val jsonObject: String, ... mais a échoué
Raju yourPepe
45

Sachez qu'il y a org.codehaus.jackson.annotate.JsonPropertydans Jackson 1.x et com.fasterxml.jackson.annotation.JsonPropertydans Jackson 2.x. Vérifiez quel ObjectMapper vous utilisez (à partir de quelle version) et assurez-vous d'utiliser l'annotation appropriée.

m3th0dman
la source
Il existe également un org.json4s.jacksonespace de noms. :) et éventuellement une autre implémentation de jacksonYMMV.
Jesse Chisholm
14

Il existe une autre option pour renommer le champ:

Jackson MixIns .

Utile si vous traitez avec des classes tierces, que vous ne pouvez pas annoter , ou si vous ne voulez tout simplement pas polluer la classe avec des annotations spécifiques à Jackson.

La documentation Jackson pour Mixins est obsolète, cet exemple peut donc apporter plus de clarté. En substance: vous créez une classe mixin qui effectue la sérialisation comme vous le souhaitez. Puis enregistrez-le dans l'ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
Dimitar II
la source
Je suis curieux que cela affecte les performances lors de la sérialisation / désérialisation des champs?
chanllen
2

Jackson

Si vous utilisez Jackson, vous pouvez utiliser l' @JsonPropertyannotation pour personnaliser le nom d'une propriété JSON donnée.

Par conséquent, il vous suffit d'annoter les champs d'entité avec l' @JsonPropertyannotation et de fournir un nom de propriété JSON personnalisé, comme ceci:

@Entity
public class City {

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

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE ou JakartaEE JSON-B

JSON-B est la couche de liaison standard pour la conversion d'objets Java vers et depuis JSON. Si vous utilisez JSON-B, vous pouvez remplacer le nom de la propriété JSON via l' @JsonbPropertyannotation:

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Vlad Mihalcea
la source