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"
]
}

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:



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.


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í

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.