En jsonSchema puedes indicar si los campos definidos son obligatorios o no usando el 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"
]
}
En ciertos casos, me gustaría que el messageVersion
campo no fuera obligatorio. ¿Hay alguna forma de condicionar la obligatoriedad de este campo?
jsonschema
tom redfern
fuente
fuente
Respuestas:
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 larequired
palabra clave. Para cada propiedad endependencies
, 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"También hay una forma corta si el esquema solo contiene la
required
palabra clave.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"
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 laanyOf
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".
If-Then-Else
Una adición relativamente nueva a JSON Schema (borrador-07) agrega las palabras clave
if
,then
yelse
. Si la propiedad "foo" es igual a "bar", entonces se requiere la propiedad "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 usarconst
.fuente
if-then-else
palabras clave y me niego a usarlas. Pero, si eliges usarlo, te sugiero que siempre los envuelvas en unallOf
formato que contenga solo esas tres palabras clave.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Creo que una breve opinión sobre esto en su respuesta estaría totalmente justificada. ¿O es una larga historia?if
,then
yelse
violan esta regla porque dependen unos de otros.allOf
== Y,anyOf
== O,oneOf
== XOR ynot
== NO. Puede buscar en Google "álgebra booleana" para obtener más recursos sobre cuestiones matemáticas (como la implicación).