json schema date-time does not check correctly

87,228

Solution 1

For Python's jsonschema library, specify the format checker when calling validate:

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

To validate a date-time format, the strict-rfc3339 package should be installed.

See Validating Formats.

Solution 2

Validation with "format" is optional. This is partly because schema authors are allowed to completely make up new formats, so expecting all formats to be validated is not reasonable.

Your library should (if it is decent) have a way to register custom validators for particular formats. For example, the tv4 validation library (in JavaScript) has the tv4.addFormat() method:

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

Once you've done this, then "format": "date-time" in the schema should validate dates correctly.

Solution 3

It is highly likely that the implementation of JSON schema validation that you're using is requiring the T separator between the date and time components. This is a staple of the RFC3339 spec and ISO8601 which it is based upon. While both have provisions for omitting the T, they both make it something that can be done by agreement, rather then a mandatory thing to support. (Go figure.)

Also, RFC3339 does require that you include either a time zone offset or a Z to indicate UTC. This locks it down to a particular moment in time, rather than a human representation of one in some unknown time zone. Since you have required neither, that's likely while it has failed validation.

From the JSON Schema spec:

7.3.1.2. Validation

A string instance is valid against this attribute if it is a valid date representation as defined by RFC 3339, section 5.6 [RFC3339].

Solution 4

I found a workaround by using this library. It checks the content of the field in 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;
}
Share:
87,228
JoachimR
Author by

JoachimR

Updated on October 19, 2020

Comments

  • JoachimR
    JoachimR over 3 years

    I have a JSON and a 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"]
    }
    

    The JSON gets validated by the JSON-schema. However if I change the field aaa to "bla" the schema does not notice that it is not a date-time any longer.

    Did I miss anything in the schema?

  • Yves M.
    Yves M. over 10 years
    Hum.. According to the specification format and also date-time format implementation are not optional.. They SHOULD be implemented.. Concerning tv4, it's probably an oversight?
  • cloudfeet
    cloudfeet over 10 years
    Right where you linked, it first says "Implementations MAY support the "format" keyword. Should they choose to do so...". So it's a MAY for supporting "format" at all - but if you do, then you SHOULD support the standard set.
  • cloudfeet
    cloudfeet over 10 years
    Out-of-the-box, tv4 doesn't support any "format" values at all. However, the project is definitely looking for a standard set of "format" validators, so you could help out if you like. :)
  • Yves M.
    Yves M. over 10 years
    Yep but you agree that tv4 definitely supports the format keyword so: "they SHOULD implement validation for attributes defined below" (date-time). Yep tv4 documentation says that "There are no built-in format validators". I'm gonna make my own validators and maybe submit them to tv4 project :)
  • cloudfeet
    cloudfeet over 10 years
    +1 for writing/submitting a set of validators for the standard set.
  • Darragh Enright
    Darragh Enright almost 9 years
    Thanks! Because I am a Python newbie it took longer than it should for me to realise you can pip install strict-rfc3339. Anyway, works like a charm!
  • PlexQ
    PlexQ almost 9 years
    Which is weird given that it should have a timezone offset no?
  • user1575921
    user1575921 about 8 years
    @cloudfeet I tried use addFormat but seems not execute, always get the error ValidationError: Invalid type: string (expected newformatname) would you see my question stackoverflow.com/questions/36105527/…, do I miss something?
  • R.Westbrook
    R.Westbrook over 6 years
    pls tell me where, I can't find it. Thank you~~
  • ndbroadbent
    ndbroadbent over 6 years
    @CodeCaster No, they have an English translation, followed by a Chinese translation underneath it.
  • CMCDragonkai
    CMCDragonkai over 3 years
    Is there a way to use format_checker argument with iter_errors?
  • Tim Ludwinski
    Tim Ludwinski over 3 years
    @CMCDragonkai You should be able to use format_checker when you instantiate the validator. For example: validator = jsonschema.Draft7Validator(schema, format_checker=jsonschema.FormatChecker()); validator.iter_errors(document).