Часто схема json может показаться излишней. На мой вкус, это довольно сложно и неуклюже, а добавление дополнительных правил только усугубляет ситуацию.
Я думаю, что более простой, но все же декларативный подход, используемый в библиотеке validol, может быть хорошей альтернативой. Суть в том, чтобы привязать бизнес-правила к данным, к которым они применяются. Сложные правила украшают более простые. И все дерево проверки представляет собой одно функциональное декларативное выражение. Кроме того, этот подход побуждает вас размещать логику проверки там, где она должна быть: в конкретном пользовательский сценарий.
Вот пример того, как это может выглядеть. Рассмотрим схему для проверки:
{
"where":{
"building":1,
"street":"Red Square"
}
}
Логика проверки отражает структуру схемы json. Все ограничения описаны прямо в самой структуре. Обо всех рутинных проверках, таких как наличие ключа json, уже позаботились.
Вот оно:
/*1 */ new FastFail<>(
/*2 */ new IsJsonObject(
/*3 */ new WellFormedJson(
/*4 */ new IndexedValue("where", jsonString)
)
),
/*7 */ whereJsonElement ->
/*8 */ new NamedBlocOfNameds<>(
/*9 */ "where",
/*10*/ List.of(
/*11*/ new AsString(
/*12*/ new Required(
/*13*/ new IndexedValue("street", whereJsonElement)
)
),
/*16*/ new AsInteger(
/*17*/ new Required(
/*18*/ new IndexedValue("building", whereJsonElement)
)
)
),
/*22*/ Where.class
)
)
.result();
Жаль, что stackoverflow не поддерживает нумерацию строк, но, тем не менее, вот что происходит построчно.
Line 1
: Вся проверка — это быстрый сбой, который возвращает ошибку, если первый аргумент приводит к ошибке.
Line 4
: Первый аргумент — это объявление блока where
.
Line 3
: Это должен быть блок правильно сформированный json.
Line 2
: Кроме того, это должен быть объект json.
Line 7
: Второй аргумент — замыкание. Его первый аргумент – это объект where
json.
Line 8
: здесь находится именованный блок именованных элементов.
Line 9
: его имя – where
.
Line 10
: второй аргумент – список всех элементов.
Line 13
: Первый элемент — street
.
Line 12
: Обязателен.
Line 11
: И должен быть представлен в виде строки.
Line 18
: Второй — building
.
Line 17
: Он также обязателен.
Line 16
: И должно быть представлено в виде целого числа.
Line 22
: Если все предыдущие проверки прошли успешно, создается объект Where
. Его первый аргумент — street
, который должен быть строкой; второй — building
, который должен быть целым числом.
Взгляните на раздел быстрого старта, где вы найдете дополнительные примеры и пошаговые инструкции. анализ линейного кода.
person
Vadim Samokhin
schedule
05.05.2020