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é ?

118
demandé sur Carsten 2012-09-25 17:07:20

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"
}
159
répondu OldCurmudgeon 2017-08-25 14:59:11

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;
 }
28
répondu CPU 100 2018-09-12 16:47:24

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

26
répondu Richeek 2015-07-13 10:42:27

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.

9
répondu StaxMan 2012-09-26 02:53:18

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; 
}
3
répondu مصطفی 2017-07-01 12:59:49

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

2
répondu DVarga 2018-02-08 18:31:39

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é.

1
répondu arush436 2018-04-25 10:14:20

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é.

0
répondu sc30 2017-11-08 15:50:12