2013-07-08 5 views
24

Sto utilizzando json-schema e voglio consentire solo le proprietà dichiarate in questo file per passare la convalida. Ad esempio, se un utente passa una proprietà "nome" nel suo oggetto json fallirà questo schema perché "nome" non è elencato qui come proprietà.Consentire solo le proprietà dichiarate nello schema JSON

Esiste qualche funzione simile a "richiesta" che consentirà il passaggio solo delle proprietà elencate?

{ 
"$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

Anche se c'è un modo, questo sembra come sparare futuro estensibilità nel piede. –

+5

In qualsiasi momento, in futuro, aggiungerò queste proprietà a questo schema. – ipengineer

+1

@ipengineer: funziona (-ish) finché * tu * sei la persona che sta eseguendo l'estensione. Significa anche che si modifica una risorsa che alcune persone potrebbero assumere è statica. – cloudfeet

risposta

3

FYI - sembra che la v5 dello standard descriva una modalità di convalida "ban unknown properties".

Quindi, invece di rendere questo requisito parte del formato (che come dice Chris Pitman nei commenti, danneggia l'estensibilità futura), è possibile semplicemente impostare il proprio validatore per contrassegnare le proprietà sconosciute come errori. Quindi, è come una modalità di validazione super-rigida che è utile per dev.

Alcuni validatori già supportano questa (ad es tv4):

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

Con questo strumento, checkRecursive dovrebbe essere usata se i dati potrebbero avere riferimenti circolari, e banUnknownProperties faranno esattamente ciò che si vuole, senza dover usare "additionalProperties":false.