Десериализация 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 шт):

Автор решения: Alexandr

Можете воспользоваться аннотацией @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)
→ Ссылка