问题
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?
回答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.
回答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.
回答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].
回答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;
}
回答5:
You can change the source code for the python jsonschema module.
Find the datetime-related code, at jsonschema/_format.py
func is_date_time(instance)
. Like this, about line 204 - 225, for version 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)
Comment out the above and paste this, or replace the _check_drafts
function above with this:
@_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
来源:https://stackoverflow.com/questions/20264146/json-schema-date-time-does-not-check-correctly