Определите обязательные поля в классе POJO для отображения JSON - PullRequest
1 голос
/ 23 декабря 2019

Я отображаю свой ответ API JSON на объект Java с помощью ObjectMapper (Джексон). Вот как выглядит мой json:

[
    {
        firstKey : "value1",
        secondKey : "value2",
        thirdKey : "value3"
    },
    {
        firstKey : "value4",
        secondKey : "value5",
        thirdKey : "value6"
    }
]

Обязательные поля: firstKey secondKey thirdKey

В некоторых моих ответах JSON могут отсутствовать все эти три обязательных поля, для которых мне бы хотелось, чтобы Джексонбросить исключение при десериализации. Как я должен сообщить Джексону о необходимых полях? Есть ли для него аннотация, кроме JsonProperty (required = true), поскольку это не работает?

Кроме того, если ключ имеет нулевое значение, он принимается по умолчанию, поэтому я также не могу использовать @NotNull. Например: [{firstKey: null, secondKey: "value2", thirKey: "value3"}] Выше приведен действительный JSON, и он должен анализироваться без каких-либо исключений во время десериализации.

1 Ответ

0 голосов
/ 23 декабря 2019

Общая функциональность проверки не реализована в Джексоне, поскольку считается, что она выходит за рамки, см., Например, Джексон - Обязательное свойство? .

И некоторая информация о том, почему аннотация @JsonProperty(required = true) не работает с полем, можно найти здесь: Джексон @JsonProperty (обязательно = true) не выдает исключение .

Однако есть прием, который может работать для null & существующие значения значимых полей, но выдают исключение, если поле полностью отсутствует. Создайте конструктор с аннотацией @JsonCreator (и не создавайте конструктор по умолчанию!), Где используется такая же аннотация @JsonProperty(value = "*field_name*", required = true), и он будет выдавать в случае пропуска поля, например:

@Getter @Setter
public class KeyHolder {
    private String firstKey;
    private String secondKey;
    private String thirdKey;

    @JsonCreator
    public KeyHolder(
            @JsonProperty(value = "firstKey", required = true) String firstKey,
            @JsonProperty(value = "secondKey", required = true) String secondKey,
            @JsonProperty(value = "thirdKey", required = true) String thirdKey) {
        this.firstKey = firstKey;
        this.secondKey = secondKey;
        this.thirdKey = thirdKey;
    }

}

Сэти действия:

new ObjectMapper().readValue("{ \"firstKey\": \"val1\", \"secondKey\": \"val2\" }"
        , KeyHolder.class);

должны привести к чему-то вроде:

com.fasterxml.jackson.databind.exc.MismatchedInputException: отсутствует обязательное свойство создателя ThirdKey (индекс 2)

...