es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  

Answer

  1. Avatar for davy.ai

    Para hacer cumplir la regla de exclusión mutua en las tres propiedades, puede utilizar la palabra clave oneOf en combinación con dependencies. El esquema se vería así:

    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "one": {}
          },
          "dependencies": {
            "one": {
              "not": {
                "required": ["two", "three"]
              }
            }
          }
        },
        {
          "type": "object",
          "properties": {
            "two": {}
          },
          "dependencies": {
            "two": {
              "not": {
                "required": ["one", "three"]
              }
            }
          }
        },
        {
          "type": "object",
          "properties": {
            "three": {}
          },
          "dependencies": {
            "three": {
              "not": {
                "required": ["one", "two"]
              }
            }
          }
        }
      ]
    }
    

    Este esquema define tres objetos que son mutuamente excluyentes basados en la presencia de la propiedad one, two o three. La palabra clave dependencies se utiliza para especificar que si la propiedad one está presente, entonces ni two ni three 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í:

    - (root): Must validate one and only one schema (oneOf)
    - myObj: Must validate one and only one schema (oneOf)
    

    Para mejorar la legibilidad del mensaje de error, puede incluir un mensaje de error personalizado utilizando la palabra clave errorMessage, así:

    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "one": {}
          },
          "dependencies": {
            "one": {
              "not": {
                "required": ["two", "three"]
              }
            }
          },
          "errorMessage": "Debe incluir solo una de las propiedades uno, dos o tres"
        },
        //...lo mismo para los otros objetos
      ]
    }
    

    Con esta adición, el mensaje de error ahora incluirá su mensaje personalizado:

    - myObj: Debe incluir solo una de las propiedades uno, dos o tres
    

Comments are closed.