En complément des autres réponses, @JsonProperty
est vraiment importante si vous utilisez l'annotation @JsonCreator
dans les classes qui n'ont pas de constructeur sans argument.
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é en tant que @JsonCreator
Jackson utilisera donc ce constructeur pour créer l'instance. Mais la sortie est comme :
Serialized : {"stringValue" : "ABCD", "myEnum" : "FIRST"}
Exception dans le fil d'exécution "main". com.fasterxml.jackson.databind.exc.InvalidFormatException : Impossible de construire une instance de ClassToSerialize$MyEnum from String value 'stringValue' : valeur ne faisant pas partie des Enum déclarés noms d'instance : [FIRST, SECOND, THIRD].
Mais après l'ajout de la @JsonProperty
dans le constructeur :
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
La désérialisation est réussie :
Serialized : {"myEnum" : "FIRST", "stringValue" : "ABCD"}
StringValue : ABCD
MyEnum : FIRST