197 votes

Comment changer le nom d'un champ dans JSON en utilisant Jackson

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

Comme je veux utiliser cette fonction avec la fonction jQuery auto complete, je veux que "id" apparaisse comme "value" dans le json et que "name" apparaisse comme "label". La documentation de jackson n'est pas claire à ce sujet et j'ai essayé toutes les annotations qui semblent, même de loin, faire ce dont j'ai besoin, mais je n'arrive pas à name pour apparaître comme label et id pour apparaître comme value dans le json.

Quelqu'un sait-il comment faire ou si c'est possible ?

358voto

henrik_lundgren Points 1646

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

53voto

m3th0dman Points 2842

Sachez qu'il y a org.codehaus.jackson.annotate.JsonProperty dans Jackson 1.x et com.fasterxml.jackson.annotation.JsonProperty dans Jackson 2.x. Vérifiez quel ObjectMapper vous utilisez (à partir de quelle version), et assurez-vous que vous utilisez la bonne annotation.

19voto

Dimitar II Points 963

Il existe une autre option pour renommer un champ :

Jackson MixIns .

Utile si vous traitez avec des classes de tierces parties, que vous êtes impossible d'annoter ou vous ne voulez tout simplement pas polluer la classe avec des annotations spécifiques à Jackson.

La documentation de Jackson pour les Mixins est dépassée, donc cette exemple peut apporter plus de clarté. En substance, vous créez une classe de mixage qui effectue la sérialisation de la manière que vous souhaitez. Puis vous l'enregistrez auprès de l'ObjectMapper :

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

14voto

Vlad Mihalcea Points 3628

Jackson

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

Par conséquent, il suffit d'annoter les champs d'entité avec l'attribut @JsonProperty et 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 à partir de et vers JSON. Si vous utilisez JSON-B, vous pouvez remplacer le nom de la propriété JSON par l'attribut @JsonbProperty annotation :

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X