В jsonSchema вы можете указать, являются ли определенные поля обязательными или нет, используя required
атрибут:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageName": {
"type": "string"
},
"messageVersion": {
"type": "string"
}
},
"required": [
"messageName",
"messageVersion"
]
}
},
"required": [
"header"
]
}
В некоторых случаях я бы хотел, чтобы messageVersion
поле не было обязательным. Есть ли способ сделать условной обязательность этого поля?
jsonschema
Том Редферн
источник
источник
Ответы:
В зависимости от вашей ситуации есть несколько разных подходов. Я могу придумать четыре разных способа условного требования поля.
Зависимости
dependencies
Ключевым словом является условным изменениемrequired
ключевого слова. Свойство Foreach вdependencies
, если свойство присутствует в проверяемом JSON, то схема, связанная с этим ключом, также должна быть действительной. Если свойство "foo" присутствует, то свойство "bar" обязательно.Также существует краткая форма, если схема содержит только
required
ключевое слово.Последствия
Если ваше условие зависит от значения поля, вы можете использовать концепцию логической логики, называемую импликацией. «A подразумевает B» эффективно означает, что если A истинно, то B также должно быть истинным. Следствие также может быть выражено как «! A или B». Либо свойство «foo» не равно «bar», либо свойство «bar» является обязательным . Или, другими словами: если свойство "foo" равно "bar", тогда свойство "bar" обязательно.
Если «foo» не равно «bar»,
#/anyOf/0
совпадения и проверка пройдены успешно. Если «foo» равно «bar»,#/anyOf/0
не выполняется и#/anyOf/1
должно быть действительным дляanyOf
успешной проверки.Enum
Если ваше условное выражение основано на перечислении, это немного проще. «foo» может быть «bar» или «baz». Если «foo» равно «bar», тогда «bar» является обязательным. Если «foo» равно «baz», то «baz» является обязательным.
Если-то-еще
Относительно новое дополнение к схеме JSON (draft-07) добавляет ключевые слова
if
,then
иelse
. Если свойство "foo" равно "bar", тогда свойство "bar" обязательно.РЕДАКТИРОВАТЬ 23.12.2017: обновлен раздел о последствиях и добавлен раздел If-Then-Else.
РЕДАКТИРОВАТЬ 06/04/2018: Исправление ошибки для If-Then-Else и обновление синглтонов
enum
для использованияconst
.источник
if-then-else
ключевых слов и отказываюсь их использовать. Но, если вы решите использовать его, я предлагаю всегда заключать их в тегallOf
, содержащий только эти три ключевых слова.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Я думаю, что краткое мнение по этому поводу в вашем ответе было бы полностью оправдано. Или это долгая история?if
,then
Иelse
нарушать это правило , потому что они зависят друг от друга.allOf
== И,anyOf
== ИЛИ,oneOf
== XOR иnot
== НЕ. Вы можете погуглить "логическую алгебру" для получения дополнительных ресурсов по математике (например, импликации).