J'ai hérité d'un certain code binaire comportant l'annotation @JsonProperty sur getter/setters. Le but est que, lorsque l'objet est sérialisé à l'aide de la bibliothèque de Jackson, les champs portent ce nom spécifique.
Code actuel:
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
Maintenant, pour un autre outil, je dois également annoter le champ avec JsonProperty. Donc ce sera mon code changé:
@JsonProperty("FILENAME")
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
Quelqu'un a-t-il utilisé la même annotation sur le champ ainsi que sur le getter/setters? J'ai regardé autour du filet mais je n'ai rien vu.
J'ai compilé et exécuté le code, mais je ne sais pas si cela causerait des problèmes par la suite. Des idées à ce sujet?
Mes observations basées sur quelques tests ont été que tout nom qui diffère du nom de propriété est celui qui prend effet:
Pour par exemple. envisager une légère modification de votre cas:
@JsonProperty("fileName")
private String fileName;
@JsonProperty("fileName")
public String getFileName()
{
return fileName;
}
@JsonProperty("fileName1")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
Le champ fileName
et la méthode getFileName
ont le nom correct de la propriété fileName
et setFileName
a un nom différent fileName1
, dans ce cas, Jackson cherchera un fileName1
attribut json au point de désérialisation et créera un attribut appelé fileName1
au point de la sérialisation.
Maintenant, pour en venir à votre cas, où les trois @JsonProperty diffèrent du nom de propriété par défaut de fileName
, il choisirait simplement l’un d’eux comme attribut (FILENAME
) et aurait les trois diffèrent, il aurait jeté une exception:
Java.lang.IllegalStateException: Conflicting property name definitions
En plus des bonnes réponses existantes, notez que Jackson 1.9 a amélioré la gestion en ajoutant "unification de propriété", ce qui signifie que TOUTES les annotations provenant de parties différentes d'une propriété logique sont combinées, en utilisant (normalement) une priorité intuitive.
Dans Jackson 1.8 et les versions antérieures, seules les annotations de champ et de lecture étaient utilisées pour déterminer quoi et comment sérialiser (écriture JSON); et seulement et des annotations de setter pour la désérialisation (lecture de JSON). Cela nécessitait parfois l’ajout d’annotations "supplémentaires", telles que l’annotation à la fois du getter et du setter.
Avec Jackson 1.9 et supérieur, ces annotations supplémentaires ne sont PAS nécessaires. Il est encore possible d'ajouter ceux-ci; et si différents noms sont utilisés, il est possible de créer des propriétés "scindées" (sérialisation utilisant un nom, désérialisation utilisant un autre): ceci est parfois utile pour renommer.