Dependiendo de su situación, existen algunos enfoques diferentes. Puedo pensar en cuatro formas diferentes de requerir condicionalmente un campo.
Dependencias
La dependencies
palabra clave es una variación condicional de la required
palabra clave. Para cada propiedad en dependencies
, si la propiedad está presente en el JSON que se está validando, entonces el esquema asociado con esa clave también debe ser válido. Si la propiedad "foo" está presente, se requiere la propiedad "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
También hay una forma corta si el esquema solo contiene la required
palabra clave.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Implicación
Si su condición depende del valor de un campo, puede usar un concepto lógico booleano llamado implicación. "A implica B" significa efectivamente que si A es verdadero, entonces B también debe serlo. La implicación también se puede expresar como "! A o B". O la propiedad "foo" no es igual a "bar", o la propiedad "bar" es obligatoria . O, en otras palabras: si la propiedad "foo" es igual a "bar", entonces se requiere la propiedad "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Si "foo" no es igual a "bar", las #/anyOf/0
coincidencias y la validación se realizan correctamente. Si "foo" es igual a "bar", #/anyOf/0
falla y #/anyOf/1
debe ser válido para que la anyOf
validación sea exitosa.
Enum
Si su condicional se basa en una enumeración, es un poco más sencillo. "foo" puede ser "bar" o "baz". Si "foo" es igual a "bar", entonces se requiere "bar". Si "foo" es igual a "baz", entonces se requiere "baz".
{
"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
Una adición relativamente nueva a JSON Schema (borrador-07) agrega las palabras clave if
, then
y else
. Si la propiedad "foo" es igual a "bar", entonces se requiere la propiedad "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDITAR 23/12/2017: Se actualizó la sección Implicación y se agregó la sección If-Then-Else.
EDITAR 04/06/2018: Corrección de errores para If-Then-Else y actualice singleton enum
s para usar const
.