Dependiendo de su situación, existen algunos enfoques diferentes. Puedo pensar en cuatro formas diferentes de requerir condicionalmente un campo.
Dependencias
La dependenciespalabra clave es una variación condicional de la requiredpalabra 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 requiredpalabra 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/0coincidencias y la validación se realizan correctamente. Si "foo" es igual a "bar", #/anyOf/0falla y #/anyOf/1debe ser válido para que la anyOfvalidació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, theny 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 enums para usar const.