Permitir solo propiedades declaradas en el esquema JSON

83

Estoy usando json-schema y solo quiero permitir que las propiedades declaradas en este archivo pasen la validación. Por ejemplo, si un usuario pasa una propiedad de "nombre" en su objeto json, fallará este esquema porque "nombre" no aparece aquí como una propiedad.

¿Existe alguna función similar a "requerida" que solo permitirá que pasen las propiedades enumeradas?

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Accounting Resource - Add Item",
"type": "object",
"properties": {
    "itemNumber": {
        "type":"string",
        "minimum": 3
    },
    "title": {
        "type":"string",
        "minimum": 5
    },
    "description": {
        "type":"string",
        "minimum": 5
    }
},
"required": [
    "itemNumber",
    "title",
    "description"
]
}
ipengineer
fuente
2
Incluso si hay una manera, esto parece disparar la extensibilidad futura en el pie.
Chris Pitman
9
En cualquier momento en el futuro, simplemente agregaré esas propiedades a este esquema.
ipengineer
1
@ipengineer: eso funciona (-ish) siempre que usted sea ​​la persona que realice la extensión. También significa que cambia un recurso que algunas personas podrían asumir que es estático.
cloudfeet
11
No hay "-ish" al respecto. No es difícil agregar nuevas propiedades a su esquema si su API comienza a aceptar nuevos accesorios en el futuro, sin importar el tamaño de su equipo. Si es así, probablemente esté haciendo algo más mal.
AJB

Respuestas:

114

Creo que lo que debe hacer para lograr esto se establece additionalPropertiesen falso. Vea la especificación aquí

Jules
fuente
En el último borrador: json-schema.org/latest/…
OneHoopyFrood
6

Para su información, parece que la v5 del estándar describirá un modo de validación de "prohibición de propiedades desconocidas" .

Entonces, en lugar de hacer que este requisito sea parte del formato (que, como dice Chris Pitman en los comentarios, daña la extensibilidad futura), simplemente puede indicarle a su validador que marque las propiedades desconocidas como errores. Entonces, es como un modo de validación súper estricto que es útil para dev.

Algunos validadores ya admiten esto (por ejemplo, tv4 ):

var result = tv4.validateMultiple(data, schema, checkRecursive, banUnknownProperties);

Con esta herramienta, checkRecursivedebe usarse si sus datos pueden tener referencias circulares, y banUnknownPropertieshará exactamente lo que desea, sin tener que usar "additionalProperties":false.

pies de nube
fuente
3

Dentro de su definición, proporcione:

  • todos los campos obligatorios dentro "required": []
  • y establecer "additionalProperties": false

MANIFESTACIÓN:

sin "additionalProperties": false: ingrese la descripción de la imagen aquí

con "additionalProperties": false: ingrese la descripción de la imagen aquí

andilabs
fuente