Em jsonSchema você pode indicar se os campos definidos são obrigatórios ou não usando o required
atributo:
{
"$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"
]
}
Em certos casos, gostaria que o messageVersion
campo não fosse obrigatório. Existe alguma maneira de tornar a obrigatoriedade deste campo condicional?
jsonschema
tom redfern
fonte
fonte
Respostas:
Dependendo da sua situação, existem algumas abordagens diferentes. Posso pensar em quatro maneiras diferentes de exigir um campo condicionalmente.
Dependências
A
dependencies
palavra-chave é uma variação condicional darequired
palavra - chave. Propriedade Foreach emdependencies
, se a propriedade estiver presente no JSON sendo validado, o esquema associado a essa chave também deve ser válido. Se a propriedade "foo" estiver presente, a propriedade "bar" é necessáriaTambém existe uma forma abreviada se o esquema contiver apenas a
required
palavra - chave.Implicação
Se sua condição depende do valor de um campo, você pode usar um conceito de lógica booleana chamado implicação. "A implica B" significa efetivamente, se A é verdadeiro, então B também deve ser verdadeiro. A implicação também pode ser expressa como "! A ou B". A propriedade "foo" não é igual a "bar" ou a propriedade "bar" é obrigatória . Ou, em outras palavras: se a propriedade "foo" for igual a "bar", então a propriedade "bar" é necessária
Se "foo" não for igual a "bar", as
#/anyOf/0
correspondências e a validação são bem-sucedidas. Se "foo" for igual a "bar",#/anyOf/0
falha e#/anyOf/1
deve ser válido para que aanyOf
validação seja bem-sucedida.Enum
Se sua condicional for baseada em um enum, é um pouco mais direto. "foo" pode ser "bar" ou "baz". Se "foo" for igual a "bar", então "bar" é necessário. Se "foo" for igual a "baz", então "baz" é necessário.
If-Then-Else
A adição relativamente nova JSON Schema (draft-07) adiciona os
if
,then
eelse
palavras-chave. Se a propriedade "foo" for igual a "bar", então a propriedade "bar" é necessáriaEDITAR 23/12/2017: Seção de implicação atualizada e seção If-Then-Else adicionada.
EDITAR 06/04/2018: Correção de bug para If-Then-Else e atualização de singleton
enum
s para usoconst
.fonte
if-then-else
palavras - chave e me recuso a usá-las. Mas, se você optar por usá-lo, sugiro sempre envolvê-los em umallOf
que contenha apenas essas três palavras-chave.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Acho que uma breve opinião sobre isso em sua resposta seria inteiramente justificada. Ou é uma longa história?if
,then
Eelse
violar esta regra, porque eles dependem uns dos outros.allOf
== AND,anyOf
== OR,oneOf
== XOR enot
== NOT. Você pode pesquisar "álgebra booleana" no Google para obter mais recursos sobre matemática (como implicação).