¿Cómo puedo requerir solamente una de un conjunto de propiedades que se especifiquen con JSON Schema?
Tengo tres propiedades: uno, dos, tres.
Si se especifica una de esas propiedades, las otras dos no deben incluirse. Por lo tanto, esta es una regla de exclusión mutua.
Intenté escribir esta regla de manera concisa, pero parece que esto no funciona:
“oneOf”: [
{
“required”: [“one”],
“not”: {“required”: [“two”, “three”]}
},
{
“required”: [“two”],
“not”: {“required”: [“one”, “three”]}
},
{
“required”: [“three”],
“not”: {“required”: [“one”, “two”]}
},
]
Eso solo arrojará un error si los tres se especifican juntos en lugar de solo más de uno. Casi quiero algo como una enumeración, pero para propiedades: poder decir que solo se puede especificar una de esta lista de propiedades.
EDITAR
De acuerdo con los comentarios del usuario, eliminé los “not” y eso funcionó, pero estoy realmente decepcionado con el mensaje de error:
- (raíz): Debe validar un esquema y solo uno (oneOf)
- myObj.0: Debe validar un esquema y solo uno (oneOf)
Súper no útil. No dice nada sobre qué propiedades no están validando. ¿Hay alguna manera de describir esto de tal manera que los usuarios obtengan un error que se parezca más a:
- myObj.0: Debe incluir una y solo una de las propiedades uno, dos o tres
De lo contrario, te deja en la oscuridad y te obliga a revisar el esquema real en lugar de hacerlo más obvio.
davy.ai
Para hacer cumplir la regla de exclusión mutua en las tres propiedades, puede utilizar la palabra clave
oneOf
en combinación condependencies
. El esquema se vería así:Este esquema define tres objetos que son mutuamente excluyentes basados en la presencia de la propiedad
one
,two
othree
. La palabra clavedependencies
se utiliza para especificar que si la propiedadone
está presente, entonces nitwo
nithree
deben estar presentes, y lo mismo ocurre con las otras propiedades.Si un usuario intenta proporcionar más de una de las propiedades, recibirá un mensaje de error que se ve algo así:
Para mejorar la legibilidad del mensaje de error, puede incluir un mensaje de error personalizado utilizando la palabra clave
errorMessage
, así:Con esta adición, el mensaje de error ahora incluirá su mensaje personalizado: