Десериализация json. Распарсить некорректный enum
На API контроллер отправляю json из postman-а, что-то вроде:
{
"name": "Ivan",
"lastName": "Ivanov",
"activity": "student"
}
У меня есть класс с несколькими полями, один из которых enum. Просто пример:
class Person {
String name;
String lastName;
Activity activity;
}
enum Activity {
@JsonProperty("teacher")
TEACHER,
@JsonProperty("student")
STUDENT,
@JsonProperty("unknown")
UNKNOWN;
}
Мне нужно из json получить объект Person. Но нужно учесть, что для поля activity в json может быть указано любое значение, и в случае, если это не teacher или student, нужно присвоить полю activity значение unknown.
Если я пытаюсь распарсить json с известным значением enum, то всё проходит успешно, создаётся объект Person. Но если в json для поля activity указать любое другое значение, то объект не создаётся, я получаю bad request в постмане.
Пытался указывать разные аннотации для enum unknown, но ничего не выходит.
Как распарсить json, в котором для поля activity будет введено неизвестное значение enum-а и в итоге экземпляру класса Person для поля activity было присвоено значение unknown?
Ответы (1 шт):
Можете воспользоваться аннотацией @JsonEnumDefaultValue:
package com.somepackage;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Setter;
import lombok.ToString;
public class Main {
@Setter
@ToString
static class Person {
String name;
String lastName;
Activity activity;
}
enum Activity {
@JsonProperty("teacher")
TEACHER,
@JsonProperty("student")
STUDENT,
@JsonProperty("unknown")
@JsonEnumDefaultValue
UNKNOWN;
}
public static void main(String[] args) throws Exception {
String str =
"{\n" +
" \"name\": \"Ivan\",\n" +
" \"lastName\": \"Ivanov\",\n" +
" \"activity\": \"activity\"\n" +
"}";
ObjectMapper objectMapper =
new ObjectMapper();
objectMapper.enable(
DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
Person person =
objectMapper.readValue(
str, Person.class);
System.out.println(person);
}
}
Результат:
Main.Person(name=Ivan, lastName=Ivanov, activity=UNKNOWN)