Além de outras respostas, a @JsonProperty
anotação é realmente importante se você usar a @JsonCreator
anotação em classes que não possuem um construtor 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);
}
}
Neste exemplo, o único construtor é marcado como @JsonCreator
, portanto, Jackson usará esse construtor para criar a instância. Mas a saída é como:
Serializado: {"stringValue": "ABCD", "myEnum": "PRIMEIRO"}
Exceção no encadeamento "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: Não é possível construir a instância de ClassToSerialize $ MyEnum a
partir do valor da String 'stringValue': value não um dos nomes de instância declarados da Enum: [PRIMEIRO, SEGUNDO, TERCEIRO]
Mas após a adição da @JsonProperty
anotação no construtor:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
A desserialização foi bem-sucedida:
Serializado: {"myEnum": "PRIMEIRO", "stringValue": "ABCD"}
StringValue: ABCD
MyEnum: FIRST