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 da required
palavra - chave. Propriedade Foreach em dependencies
, 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ária
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Também existe uma forma abreviada se o esquema contiver apenas a required
palavra - chave.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
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
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
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 a anyOf
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.
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
If-Then-Else
A adição relativamente nova JSON Schema (draft-07) adiciona os if
, then
e else
palavras-chave. Se a propriedade "foo" for igual a "bar", então a propriedade "bar" é necessária
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDITAR 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 uso const
.