web-dev-qa-db-fra.com

la date-heure du schéma json ne vérifie pas correctement

J'ai un JSON et un schéma JSON

JSON:

{
"aaa": "4000-02-01 00:00:00"
}

Schéma JSON:

{
    "$schema": "http://json-schema.org/draft-04/schema",
    "type": "object",
    "properties": {

        "aaa": {
            "type": "string",
            "format": "date-time"
        }


    }, "required": ["aaa"]
}

Le JSON est validé par le schéma JSON. Cependant si je change le champ aaa en "bla" le schéma ne remarque plus que ce n'est plus une date-heure.

Ai-je oublié quelque chose dans le schéma?

31
IHeartAndroid

Pour la bibliothèque jsonschema de Python, spécifiez le vérificateur de format lors de l'appel de validate:

jsonschema.validate(data, schema, format_checker=jsonschema.FormatChecker())

Pour valider un format date-heure, le package strict-rfc3339 doit être installé.

Voir Validation des formats .

31
Beau Barker

La validation avec "format" Est facultative. Cela est dû en partie au fait que les auteurs de schémas sont autorisés à créer complètement de nouveaux formats, il n'est donc pas raisonnable de s'attendre à ce que tous les formats soient validés.

Votre bibliothèque devrait (si elle est décente) avoir un moyen d'enregistrer des validateurs personnalisés pour des formats particuliers. Par exemple, la bibliothèque de validation tv4 (En JavaScript) a la méthode tv4.addFormat() :

tv4.addFormat('date-time', function (data) {
    return isValidDate(data);
});

Une fois que vous avez fait cela, alors "format": "date-time" Dans le schéma devrait valider les dates correctement.

9
cloudfeet

Il est fort probable que l'implémentation de la validation de schéma JSON que vous utilisez nécessite le séparateur T entre les composants de date et d'heure. Il s'agit d'un élément de base des spécifications RFC3339 et ISO8601 sur lesquelles il est basé. Bien que les deux aient des dispositions pour omettre le T, ils en font tous deux quelque chose qui peut être fait par accord, plutôt qu'une chose obligatoire à supporter. (Allez comprendre.)

En outre, RFC3339 le fait nécessite que vous incluiez soit un décalage de fuseau horaire soit un Z pour indiquer UTC. Cela le verrouille à un moment particulier dans le temps, plutôt qu'à une représentation humaine d'un dans un fuseau horaire inconnu. Étant donné que vous n'avez demandé ni l'un ni l'autre, il est probable que la validation ait échoué.

De la spécification du schéma JSON :

7.3.1.2. Validation

Une instance de chaîne est valide par rapport à cet attribut s'il s'agit d'une représentation de date valide telle que définie par RFC 3339, section 5.6 [RFC3339].

5
Matt Johnson-Pint

J'ai trouvé une solution de contournement en utilisant cette bibliothèque . Il vérifie le contenu du champ en code javascript:

function isValidDate(datestring) {

    var format = d3.time.format("%Y-%m-%d %H:%M:%S");
    var date = format.parse(datestring);  
    if (date) {
        return true;
    }
    return false;
}
2
IHeartAndroid