personalizado etiqueta estilo ejemplos ejemplo editar con cambiar atributo jsonschema

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?