275 votes

Quand la propriété @JsonProperty est-elle utilisée et à quoi sert-elle ?

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é par câble en utilisant le rappel ajax 'success' :

        success : function(response) {  
            if(response.State.isSet){   
                alert('success called successfully)
            }

L'annotation @JsonProperty est-elle nécessaire ici ? Quel est l'avantage de l'utiliser ? Je pense que je peux supprimer cette annotation sans provoquer d'effets secondaires.

En lisant cette annonce sur https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Je ne sais pas quand il faut l'utiliser ?

327voto

OldCurmudgeon Points 16615

Voici un bon exemple. Je l'utilise pour renommer la variable parce que le JSON provient d'un fichier de type .Net environnement 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 les données vers/depuis le JSON :

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}

61voto

CPU 100 Points 2269

Je pense que OldCurmudgeon et StaxMan ont tous deux raison mais voici une réponse en une phrase avec un exemple simple pour vous.

@JsonProperty(name), indique à Jackson ObjectMapper de faire correspondre 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;
 }

49voto

Richeek Points 1131

Eh bien, pour ce que ça vaut maintenant... JsonProperty est AUSSI utilisé pour spécifier des 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 :

{
  "check": true
}

et une classe Deserializer :

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

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 également un coup d'œil à cette documentation : http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

30voto

StaxMan Points 34626

Sans annotations, le nom de la propriété déduite (pour correspondre au JSON) serait "set", et non -- comme cela semble être l'intention -- "isSet". En effet, selon les spécifications de Java Beans, les méthodes de la forme "isXxx" et "setXxx" sont considérées comme signifiant qu'il existe une propriété logique "xxx" à gérer.

11voto

مصطفی Points 561

Comme vous le savez, il s'agit de sérialiser et de désérialiser 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 système, dans certains cas, vous devez renommer la variable dans la sérialisation/désérialisation. @JsonProperty est une métadonnée qui indique au sérialiseur comment sérialiser l'objet. Elle est utilisée pour :

  • nom de la variable
  • accès (LIRE, ECRIRE)
  • valeur par défaut
  • obligatoire/optionnel

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

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