etiqueta - Atributo jsonSchema requerido condicionalmente
title html personalizado (1)
Dependiendo de su situación, hay algunos enfoques diferentes. Puedo pensar en cuatro formas diferentes de requerir condicionalmente un campo.
Dependencias
La palabra clave de
dependencies
es una variación condicional de la palabra clave
required
.
Para cada propiedad en
dependencies
, si la propiedad está presente en el JSON que se valida, entonces el esquema asociado con esa clave también debe ser válido.
Si la propiedad "foo" está presente, entonces se requiere la propiedad "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
También hay una forma abreviada si el esquema solo contiene la palabra clave
required
.
{
"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 ser verdadero. La implicación también se puede expresar como "! A o B". O la propiedad "foo" no es igual a "bar", o se requiere la propiedad "bar" . 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",
#/anyOf/0
coincide y la validación tiene éxito.
Si "foo" es igual a "barra",
#/anyOf/0
falla y
#/anyOf/1
debe ser válido para que la validación
anyOf
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"]
}
]
}
Si-entonces-otro
Una adición relativamente nueva al
esquema JSON (draft-07)
agrega las palabras clave
if
,
then
y
else
.
Si la propiedad "foo" es igual a "barra", entonces se requiere la propiedad "barra"
{
"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 de implicación y se agregó la sección If-Then-Else.
EDITAR 06/04/2018:
corrección de errores para If-Then-Else y actualizar
enum
singleton para usar
const
.
En jsonSchema puede indicar si los campos definidos son obligatorios o no utilizando el atributo "requerido":
{
"$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"
]
}
En ciertos casos, me gustaría que el campo messageVersion no sea obligatorio. ¿Hay alguna forma de hacer que la obligatoriedad de este campo sea condicional?