Además de otras respuestas, la @JsonProperty
anotación es realmente importante si usa la @JsonCreator
anotación en clases que no tienen un constructor sin argumentos.
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);
}
}
En este ejemplo, el único constructor está marcado como @JsonCreator
, por lo tanto, Jackson usará este constructor para crear la instancia. Pero la salida es como:
Serializado: {"stringValue": "ABCD", "myEnum": "FIRST"}
Excepción en el subproceso "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: No se puede construir la instancia de ClassToSerialize $ MyEnum a
partir del valor de cadena 'stringValue': valor no uno de los nombres de instancia de Enum declarados: [FIRST, SECOND, THIRD]
Pero después de la adición de la @JsonProperty
anotación en el constructor:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
La deserialización es exitosa:
Serializado: {"myEnum": "FIRST", "stringValue": "ABCD"}
StringValue: ABCD
MyEnum: PRIMERO