web-dev-qa-db-fra.com

Schéma JSON - requiert toutes les propriétés

Le champ required dans le schéma JSON

Le 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.

Le problème

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?

26
Adam Matan

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
}
24
San Jay

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.

7
jruizaranguren

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
    }
}
0
Dallas