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 establezco additionalProperties en false cuando estoy usando un array?

El archivo que se está validando se ve así:

MyArray:
  - someItemWithRandomName:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff
  - someOtherItemWithRandomName:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff
  - anotherItem:
    one: f9jfw9j302
    two: 09dj0293jff
    three: 09dj0293jff

Lo estoy validando de esta manera:

"MyArray": {
  "type": "array",
  "items": {
    "type": "object",
    "additionalProperties": false,
    "required": [
      "one",
      "two",
      "three"
    ],
    "properties": {
      "one": {
          "type": "string"
      },
      "two": {
          "type": "string"
      },
      "three": {
          "type": "string"
      }
    }
  }

No quiero permitir campos en los elementos del array que no estén definidos en el esquema pero additionalProperties: false no funciona porque las claves de los elementos del array pueden ser cualquier cadena. ¿Cómo se acomoda esto?

Edición:

Aquí hay un ejemplo en vivo de mi validación. Supongo que el YAML se convertirá en JSON como en este ejemplo antes de ser validado: https://www.jsonschemavalidator.net/s/PBmLkkBl

Tags:  

Answer

  1. Avatar for davy.ai

    Para adaptarse al hecho de que las claves de los elementos del array pueden ser cualquier cadena, puedes usar la palabra clave patternProperties en lugar de properties. Esto te permite definir un patrón de expresión regular que las claves deben cumplir para ser válidas.

    Por ejemplo, si deseas permitir cualquier cadena como clave pero aún así validar los valores de las propiedades, puedes modificar el esquema de la siguiente manera:

    "MyArray": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "one",
          "two",
          "three"
        ],
        "patternProperties": {
          ".*": { // esta expresión regular coincide con cualquier cadena
            "type": "string"
          }
        }
      }
    }
    

    Esto seguirá requiriendo que los objetos del array tengan las propiedades "one", "two" y "three", mientras permite cualquier cadena como clave para propiedades adicionales. La palabra clave additionalProperties todavía está establecida en falso, pero la palabra clave patternProperties la anula para las claves que coinciden con la expresión regular.

    Ten en cuenta que puedes modificar la expresión regular para adaptarla a tus necesidades, dependiendo de qué cadenas deseas permitir como claves.

Comments are closed.