Прежде всего, обратите внимание, что JsonProperty
используется для обозначения имен свойств, а не их значений. В этом примере DEFAULT
является элементом перечисления, а не его свойством / полем / методом, поэтому эта аннотация не будет подходящей.
Чтобы десериализовать элемент enum из нескольких возможных значений, вам нужно создать простой JsonDeserializer
, который будет выполнять сопоставление. Например:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class PrintTypeDeserializer extends JsonDeserializer<PrintType> {
private static final Set<String> DEFAULT_VALUES = new HashSet<>(Arrays.asList("", "default"));
@Override
public PrintType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
final String value = jsonParser.getValueAsString();
if (DEFAULT_VALUES.contains(value)) {
return PrintType.DEFAULT;
}
return PrintType.valueOf(value);
}
}
Чтобы использовать этот десериализатор, либо объявите его в поле PrintType
для десериализации:
public class MyObj {
@JsonProperty("print_type")
@JsonDeserialize(using = PrintTypeDeserializer.class)
private PrintType printType;
}
(Но это должно быть дублировано, если PrintType
появляется в разных объектах)
Или зарегистрируйте десериализатор в соответствующем ObjectMapper
:
private static ObjectMapper initObjectMapper() {
final ObjectMapper mapper = new ObjectMapper();
final SimpleModule module = new SimpleModule();
module.addDeserializer(PrintType.class, new PrintTypeDeserializer());
mapper.registerModule(module);
return mapper;
}
Теперь короткий тестовый пример:
public enum PrintType {
DEFAULT, TYPE_A, TYPE_B;
}
@Test
public void deserializeEnum() {
final List<String> jsons = Arrays.asList(
"{ \"print_type\": null }",
"{ \"print_type\": \"\" }",
"{ \"print_type\": \"default\" }",
"{ \"print_type\": \"DEFAULT\" }",
"{ \"print_type\": \"TYPE_A\" }",
"{ \"print_type\": \"TYPE_B\" }"
);
final ObjectMapper mapper = initObjectMapper();
jsons.stream().forEach(json -> {
try {
System.out.println(mapper.readValue(json, MyObj.class));
} catch (IOException e) {
throw new IllegalStateException(e);
}
});
}
// output:
// MyObj(printType=null)
// MyObj(printType=DEFAULT)
// MyObj(printType=DEFAULT)
// MyObj(printType=DEFAULT)
// MyObj(printType=TYPE_A)
// MyObj(printType=TYPE_B)