Ce haricot 'State':
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
est envoyé sur le fil en utilisant le rappel ajax 'success':
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
L'annotation @JsonProperty est-elle requise ici? Quel est l'avantage de l'utiliser? Je pense que je peux supprimer cette annotation sans provoquer d'effets secondaires.
En lisant cette annotion sur https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Je ne sais pas quand cela doit être utilisé?
Réponses:
Voici un bon exemple. Je l'utilise pour renommer la variable car le JSON provient d'un
.Net
environnement où les propriétés commencent par une lettre majuscule.Cela analyse correctement vers / depuis le JSON:
la source
@JsonProperty
annotation.Double
? Je me demande simplement si le type doit êtreString
ou n'importe quel type pris en charge par JSON? Pourrait-il être n'importe quel type? @OldCurmudgeonJe pense que OldCurmudgeon et StaxMan sont tous les deux corrects, mais voici une réponse en une phrase avec un exemple simple pour vous.
@JsonProperty (nom), indique à Jackson ObjectMapper de mapper le nom de la propriété JSON avec le nom du champ Java annoté.
la source
bien pour ce que ça vaut maintenant ... JsonProperty est ÉGALEMENT utilisé pour spécifier les méthodes getter et setter pour la variable en dehors de la sérialisation et de la désérialisation habituelles. Par exemple, supposons que vous ayez une charge utile comme celle-ci:
et une classe Deserializer:
Dans ce cas, l'annotation JsonProperty est alors nécessaire. Cependant si vous avez également une méthode dans la classe
Jetez aussi un œil à cette documentation: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
la source
Sans annotations, le nom de la propriété inférée (pour correspondre à partir de JSON) serait "set", et non - comme cela semble être l'intention - "isSet". En effet, selon la spécification Java Beans, les méthodes de la forme «isXxx» et «setXxx» signifient qu'il existe une propriété logique «xxx» à gérer.
la source
Comme vous le savez, il s'agit de sérialiser et de désaliniser un objet. Supposons qu'il y ait un objet:
La sérialisation de cet objet est:
Le nom de la variable est directement utilisé pour sérialiser les données. Si vous êtes sur le point de supprimer l'API système de l'implémentation système, dans certains cas, vous devez renommer la variable dans la sérialisation / désérialisation. @JsonProperty est une méta-données pour indiquer au sérialiseur comment mettre en série un objet. Il sert à:
de l'exemple:
la source
L'ajout de JsonProperty garantit également la sécurité au cas où quelqu'un déciderait de changer l'un des noms de propriété sans se rendre compte que la classe en question sera sérialisée en un objet Json. S'ils modifient le nom de la propriété, JsonProperty garantit qu'il sera utilisé dans l'objet Json, et non dans le nom de la propriété.
la source
En plus d'autres réponses, l'
@JsonProperty
annotation est vraiment importante si vous utilisez l'@JsonCreator
annotation dans des classes qui n'ont pas de constructeur sans argument.Dans cet exemple, le seul constructeur est marqué comme
@JsonCreator
, par conséquent Jackson utilisera ce constructeur pour créer l'instance. Mais la sortie est comme:Mais après l'ajout de l'
@JsonProperty
annotation dans le constructeur:La désérialisation est réussie:
la source
En plus de toutes les réponses ci-dessus, n'oubliez pas la partie de la documentation qui dit
Si vous avez une
non-static
méthode dans votre classe qui n'est pas conventionnelle,getter or setter
vous pouvez la faire agir comme unegetter and setter
en utilisant l'annotation dessus. Voir l'exemple ci-dessousLorsque l'objet ci-dessus est sérialisé, la réponse contiendra
getUsername()
getId()
getIdAndUsername
*Puisque la méthode
getIdAndUsername
commence par,get
elle est traitée comme un getter normal, pourquoi vous pouvez l'annoter avec@JsonIgnore
.Si vous avez remarqué que le
concatenateIdAndUsername
n'est pas retourné et que c'est parce que son nom ne commence pas parget
et si vous souhaitez que le résultat de cette méthode soit inclus dans la réponse, vous pouvez l'utiliser@JsonProperty("...")
et il sera traité comme normalgetter/setter
comme mentionné dans la documentation en surbrillance ci-dessus .la source
De JsonProperty javadoc,
la source