required
dans le schéma JSONLe schéma JSON comporte les champs properties
, required
et additionalProperties
. Par exemple,
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"required": [
"elephant",
"giraffe",
"polarBear"
],
"additionalProperties": false
}
Validera les objets JSON comme:
{
"elephant": "Johnny",
"giraffe": "Jimmy",
"polarBear": "George"
}
Mais échouera si la liste des propriétés n'est pas exactementelephant, giraffe, polarBear
.
Je copie souvent la liste de properties
dans la liste de required
, et je souffre de bugs embêtants lorsque les listes ne correspondent pas à cause de fautes de frappe ou d’autres erreurs stupides.
Y a-t-il un moyen plus court de signaler que toutes les propriétés sont requises, sans les nommer explicitement?
Vous pouvez simplement utiliser la propriété "minProperties" au lieu de nommer explicitement tous les champs.
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"additionalProperties": false,
"minProperties": 3
}
Je doute qu'il existe un moyen de spécifier des propriétés requises autres que les nommer explicitement dans le tableau requis.
Mais si vous rencontrez ce problème très souvent, je vous suggérerais d'écrire un petit script post-traitant votre schéma json et d'ajouter automatiquement le tableau requis pour tous les objets définis.
Le script doit simplement parcourir l'arborescence json-schema, et à chaque niveau, si un mot clé "properties" est trouvé, ajoutez un mot clé "required" avec toutes les clés définies contenues dans les propriétés du même niveau.
Laissez les machines faire le truc.
Je le fais dans le code avec une ligne, par exemple, si je veux utiliser required
pour insert
dans une base de données, mais que je veux uniquement valider par rapport au schéma lors de l'exécution d'une update
.
prepareSchema(action) {
const actionSchema = R.clone(schema)
switch (action) {
case 'insert':
actionSchema.$id = `/${schema.$id}-Insert`
actionSchema.required = Object.keys(schema.properties)
return actionSchema
default:
return schema
}
}