web-dev-qa-db-fra.com

Changer le nom du 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; }
}

Puisque je veux utiliser ceci avec la fonction de complétion automatique de jQuery, je souhaite que "id" apparaisse en tant que "valeur" dans le JSON et que "name" apparaisse en tant qu '"étiquette". La documentation de jackson n’est pas claire à ce sujet et j’ai essayé toutes les annotations qui semblaient bien, même de loin, faire ce dont j'avais besoin mais je ne pouvais pas obtenir name apparaître sous la forme label et id apparaître comme value dans le JSON.

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

155
Ali

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

Sachez qu'il existe 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 l'annotation appropriée.

44
m3th0dman

Il existe une option supplémentaire pour renommer le champ:

Jackson MixIns .

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

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

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);
10
Dimitar II