json schema date-time controleert niet correct

Ik heb een JSON en een JSON-schema

JSON:

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

JSON-schema:

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

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


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

De JSON wordt gevalideerd door de JSON-schema. Maar als ik het veld aaa te “bla” het schema niet in de gaten dat het niet om een datum-tijd langer.

Mis ik iets in het schema?



5 Replies
  1. 33

    Voor Python ‘ s jsonschema bibliotheek, geef de indeling checker bij het aanroepen van validate:

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

    Voor het valideren van een datum-tijd formaat, de streng-rfc3339 pakket moet worden geïnstalleerd.

    Zie Het Valideren Van Formaten.

    • Bedankt! Want ik ben een Python newbie het duurde langer dan het zou voor mij te realiseren kunt u pip install strict-rfc3339. Hoe dan ook, werkt als een charme!
  2. 9

    Validatie met "format" is optioneel. Dit is deels omdat schema auteurs zijn toegestaan om volledig nieuwe formaten, dus verwacht alle formaten worden gevalideerd is niet redelijk.

    Uw bibliotheek moet (als het goed) een manier om te registreren aangepaste validators voor specifieke indelingen worden weergegeven. Bijvoorbeeld, de tv4 validatie bibliotheek (in JavaScript) heeft de tv4.addFormat() methode:

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

    Zodra u dit hebt gedaan, dan "format": "date-time" in het schema moet valideren van data correct.

    • Hum.. Volgens de specificaties formaat en ook datum-tijd formaat uitvoering zijn niet optioneel.. Ze MOETEN worden uitgevoerd.. Over tv4, het is waarschijnlijk een toezicht?
    • Precies waar u aan verbonden bent, het eerste zegt “Implementaties MAG ondersteuning van de “format” trefwoord. Moeten zij ervoor kiezen om dit te doen…”. Het is dus MOGELIJK voor de ondersteuning van “formaat” in alle – maar als je dat doet, dan MOET u de standaard instellen.
    • Out-of-the-box, tv4 ondersteunt geen “format” waarden op alle. Het project is echter zeker op zoek naar een standaard set van “formaat” validators, dus je zou kunnen helpen als je wilt. 🙂
    • Yep, maar u stemt ermee in dat tv4 zeker de indeling ondersteunt trefwoord dus: “ze MOETEN implementeren validatie voor kenmerken gedefinieerd hieronder” (date-time). Yep tv4 documentatie zegt dat “Er zijn geen ingebouwde notatie validators“. Ik ga mijn eigen validatie-en misschien zijn ze voor te leggen aan tv4 project 🙂
    • +1 voor het schrijven van/het indienen van een set van validators voor de standaard set.
    • Ik heb geprobeerd gebruik addFormat, maar lijkt niet uit te voeren, krijgen altijd de fout ValidationError: Invalid type: string (expected newformatname) zou je mijn vraag stackoverflow.com/questions/36105527/…, mis ik iets?

  3. 5

    Het is zeer waarschijnlijk dat de uitvoering van JSON schema validatie die je gebruikt is waarvoor het T scheidingsteken tussen de datum en tijd onderdelen. Dit is een hoofdbestanddeel van de RFC3339 spec en ISO8601 waar het op gebaseerd is. Terwijl beide bepalingen voor het weglaten van de T, ze beiden in iets dat kan worden gedaan door de overeenkomst, in plaats van een verplichte zaak te ondersteunen. (Go figure.)

    Ook, RFC3339 doet vereisen dat u een tijdzone of een Z om aan te geven UTC. Deze sloten op een bepaald moment in de tijd, in plaats van een menselijke voorstelling van een in een onbekende tijdszone. Aangezien u nodig noch, die waarschijnlijk tijdens het validatie is mislukt.

    Van de JSON Schema spec:

    7.3.1.2. Validatie

    Een string exemplaar is geldig tegen dit kenmerk als het een geldige datum weergave zoals gedefinieerd door RFC 3339, paragraaf 5.6 [RFC3339].

  4. 2

    Ik vond een oplossing door het gebruik van deze bibliotheek. Het controleert de inhoud van het veld in de javascript-code:

    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;
    }
    • Dat is vreemd gezien het feit dat het moet hebben van een timezone offset nee?
    • of gebruik moment
  5. -1

    Kunt u de broncode voor de python jsonschema module.

    Vinden de datetime-gerelateerde code, op jsonschema/_format.py func is_date_time(instance). Zoals deze, over de lijn 204 – 225, voor versie 2.6.0:

    try:
        import strict_rfc3339
    except ImportError:
        try:
            import isodate
        except ImportError:
            pass
        else:
            @_checks_drafts("date-time", raises=(ValueError, isodate.ISO8601Error))
            def is_datetime(instance):
                if not isinstance(instance, str_types):
                    return True
                return isodate.parse_datetime(instance)
    else:
        @_checks_drafts("date-time")
        def is_datetime(instance):
            if not isinstance(instance, str_types):
                return True
            return strict_rfc3339.validate_rfc3339(instance)

    Commentaar uit de bovenstaande en plak deze op of vervang de _check_drafts bovenstaande functie met deze:

    @_checks_drafts("date-time")
    def is_datetime(instance):
        if not isinstance(instance, str_types):
            return True
        try:
            datetime.datetime.strptime(instance, "%Y-%m-%d %H:%M:%S")
        except ValueError:
            return False
        return True
    • pls vertel me waar, ik kan het niet vinden. Dank u~~
    • Nee, ze hebben een engelse vertaling, gevolgd door een Chinese vertaling eronder.
    • ok , ik snap het! Dank u~~~

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *