Quand la propriété @JsonProperty est-elle utilisée et à quoi sert-elle?
Ce bean "État":
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 causer d'effets secondaires.
Lecture de cette annotion sur https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Je ne sais pas quand cela doit être utilisé ?
8 réponses
Voici un bon exemple. Je l'utilise pour renommer la variable car le JSON provient d'un environnement .Net
où les propriétés commencent par une lettre majuscule.
public class Parameter {
@JsonProperty("Name")
public String name;
@JsonProperty("Value")
public String value;
}
Cela analyse correctement vers / depuis le JSON:
"Parameter":{
"Name":"Parameter-Name",
"Value":"Parameter-Value"
}
Je pense que OldCurmudgeon et StaxMan sont tous deux corrects, mais voici une réponse de phrase avec un exemple simple pour vous.
@jsonproperty (nom), indique à Jackson ObjectMapper de mapper le nom de la propriété JSON au nom du champ Java annoté.
//example of json that is submitted
"Car":{
"Type":"Ferrari",
}
//where it gets mapped
public static class Car {
@JsonProperty("Type")
public String type;
}
Eh bien pour ce qu'il 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 ceci:
{
"check": true
}
Et une classe de désérialiseur:
public class Check {
@JsonProperty("check") // It is needed else Jackson will look got getCheck method and will fail
private Boolean check;
public Boolean isCheck() {
return check;
}
}
Alors, dans ce cas, l'annotation JsonProperty est nécessaire. Cependant, si vous avez également une méthode dans la classe
public class Check {
//@JsonProperty("check") Not needed anymore
private Boolean check;
public Boolean getCheck() {
return check;
}
}
Jetez un oeil à cette documentation aussi: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
Sans annotations, le nom de propriété inféré (pour correspondre à JSON) serait "set", et non-comme semble être l'intention - "isSet". En effet, selon la spécification Java Beans, les méthodes de forme "isXxx" et " setXxx "sont prises pour signifier qu'il existe une propriété logique" xxx " à gérer.
Comme vous le savez, il s'agit de sérialiser et de désaliniser un objet. Supposons qu'il y ait un objet:
public class Parameter {
public String _name;
public String _value;
}
, La sérialisation de cet objet est:
{
"_name": "...",
"_value": "..."
}
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 du système, dans certains cas, vous devez renommer la variable en sérialisation/désérialisation. @JsonProperty est une méta-données pour indiquer au sérialiseur comment faire un objet série. Il est utilisé pour:
- variable nom
- Accès (lecture, écriture)
- valeur par défaut
- obligatoire/facultatif
De l'exemple:
public class Parameter {
@JsonProperty(
value="Name",
required=true,
defaultValue="No name",
access= Access.READ_WRITE)
public String _name;
@JsonProperty(
value="Value",
required=true,
defaultValue="Empty",
access= Access.READ_WRITE)
public String _value;
}
En plus des autres réponses, l'annotation @JsonProperty
est vraiment importante si vous utilisez l'annotation @JsonCreator
dans les classes qui n'ont pas de constructeur no-arg.
public class ClassToSerialize {
public enum MyEnum {
FIRST,SECOND,THIRD
}
public String stringValue = "ABCD";
public MyEnum myEnum;
@JsonCreator
public ClassToSerialize(MyEnum myEnum) {
this.myEnum = myEnum;
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
String jsonString = mapper.writeValueAsString(classToSerialize);
System.out.println(jsonString);
ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
System.out.println("StringValue: " + deserialized.stringValue);
System.out.println("MyEnum: " + deserialized.myEnum);
}
}
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:
Sérialisé: {"stringValue":"ABCD","myEnum":"PREMIER"}
Exception dans thread "main" COM.fasterxml.Jackson.databind.exc.InvalidFormatException: ne peut pas construire l'instance de COM.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $ MyEnum from String value 'stringValue': valeur n'appartenant pas à L'énumération déclarée noms d'instance: [premier, deuxième, troisième]
Mais après l'ajout de l'annotation @JsonProperty
dans le constructeur:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
La désérialisation est réussie:
Sérialisé: {"myEnum":"PREMIER","stringValue":"ABCD"}
StringValue: ABCD
MyEnum: premier
L'ajout de JsonProperty assure également la sécurité dans le cas où quelqu'un décide de changer l'un des noms de propriété sans réaliser 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 le nom de la propriété.
Depuis jsonproperty javadoc,
Définit le nom de la propriété logique, c'est-à-dire le nom du champ de l'objet JSON à utiliser pour la propriété. Si la valeur est une Chaîne vide (qui est la valeur par défaut), essaie d'utiliser le nom du champ qui est annoté.