JSON Schema-require toutes les propriétés

required Champ dans le schéma JSON

le schéma JSON comporte le properties,required et additionalProperties champs. Par exemple,

{
    "type": "object",
    "properties": {
        "elephant": {"type": "string"},
        "giraffe": {"type": "string"},
        "polarBear": {"type": "string"}
    },
    "required": [
        "elephant",
        "giraffe",
        "polarBear"
    ],
    "additionalProperties": false
}

va valider les objets JSON comme:

{
    "elephant": "Johnny",
    "giraffe": "Jimmy",
    "polarBear": "George"
}

Mais échouera si la liste de propriétés n'est pas exactementelephant, giraffe, polarBear.

Le problème

j'ai souvent des copier-coller la liste des properties à la liste de required, et souffrent de bugs gênants quand les listes ne correspondent pas à cause des fautes de frappe et d'autres erreurs stupides.

y a-t-il un moyen plus court pour indiquer que toutes les propriétés sont nécessaires, sans les nommer explicitement?

21
demandé sur Adam Matan 2015-06-16 15:48:01

3 réponses

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
}
20
répondu San Jay 2016-10-31 22:08:17

je doute qu'il existe un moyen pour spécifier les propriétés requises d'autres que de les nommer explicitement requis tableau.

mais si vous rencontrez ce problème très souvent, je vous suggérerais d'écrire un petit script qui post-traite votre JSON-schema et ajoute automatiquement le tableau requis pour tous les objets définis.

le script a juste besoin de parcourir l'arborescence JSON-schema, et à chaque niveau, si un mot-clé" properties "est trouvé, ajouter un mot-clé "required" avec toutes les clés définies contenues dans les propriétés au même niveau.

laissez les machines s'occuper de l'alésage.

6
répondu jruizaranguren 2015-06-16 14:52:46

je le fais EN code avec un one-liner, par exemple, si je veux utiliser requiredinsert dans un DB, mais ne veulent valider par rapport au schéma lors de l'exécution d'un 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
répondu Dallas 2017-08-18 07:58:59