11 KiB
Schema Validation
jsonschema
The Basics
The simplest way to validate an instance under a given schema is to
use the validate
function.
validate
Validate an instance under the given schema.
>>> validate([2, 3, 4], {"maxItems" : 2}) Traceback (most recent call last): ... ValidationError: [2, 3, 4] is too long
validate will first
verify that the provided schema is itself valid, since not doing so can
lead to less obvious error messages and fail in less obvious or
consistent ways. If you know you have a valid schema already or don't
care, you might prefer using the ~IValidator.validate method directly on a specific
validator (e.g. Draft4Validator.validate).
- argument instance
-
the instance to validate
- argument schema
-
the schema to validate with
- argument cls
-
an
IValidatorclass that will be used to validate the instance.
If the cls argument is not provided, two things will
happen in accordance with the specification. First, if the schema has a
$schema property
containing a known meta-schema then the proper validator will be used.
The specification recommends that all schemas contain $schema properties for
this reason. If no $schema property is found, the default validator
class is Draft4Validator.
Any other provided positional and keyword arguments will be passed on
when instantiating the cls.
- raises
-
ValidationErrorif the instance is invalidSchemaErrorif the schema itself is invalid
Footnotes
The Validator Interface
jsonschema defines
an (informal) interface that all validators should adhere to.
- argument dict schema
-
the schema that the validator will validate with. It is assumed to be valid, and providing an invalid schema can lead to undefined behavior. See
IValidator.check_schemato validate a schema first. - argument types
-
Override or extend the list of known types when validating the
typeproperty. Should map strings (type names) to class objects that will be checked viaisinstance. Seevalidating-typesfor details. - type types
-
dict or iterable of 2-tuples
- argument resolver
-
an instance of
RefResolverthat will be used to resolve$refproperties (JSON references). If unprovided, one will be created. - argument format_checker
-
an instance of
FormatCheckerwhose~conformsmethod will be called to check and see if instances conform to eachformatproperty present in the schema. If unprovided, no validation will be done forformat.
DEFAULT_TYPES
The default mapping of JSON types to Python types used when
validating type
properties in JSON schemas.
META_SCHEMA
An object representing the validator's meta schema (the schema that describes valid schemas in the given version).
VALIDATORS
A mapping of validators (strs) to functions that validate the validator
property with that name. Each function should take 4 arguments: the
validator instance, the value of the current validator property in the
instance, the instance, and the schema. For more information see creating-validators.
schema
The schema that was passed in when initializing the validator.
check_schema(schema)
Validate the given schema against the validator's META_SCHEMA.
- raises
-
SchemaErrorif the schema is invalid
is_type(instance, type)
Check if the instance is of the given (JSON Schema) type.
- type type
-
str
- rtype
-
bool
- raises
-
UnknownTypeiftypeis not a known type.
The special type "any" is valid for any given
instance.
is_valid(instance)
Check if the instance is valid under the current schema.
- rtype
-
bool
>>> schema = {"maxItems" : 2} >>> Draft3Validator(schema).is_valid([2, 3, 4]) False
iter_errors(instance)
Lazily yield each of the validation errors in the given instance.
- rtype
-
an iterable of
ValidationErrors
>>> schema = { ... "type" : "array", ... "items" : {"enum" : [1, 2, 3]}, ... "maxItems" : 2, ... } >>> v = Draft3Validator(schema) >>> for error in sorted(v.iter_errors([2, 3, 4]), key=str): ... print(error.message) 4 is not one of [1, 2, 3] [2, 3, 4] is too long
validate(instance)
Check if the instance is valid under the current schema.
- raises
-
ValidationErrorif the instance is invalid
>>> schema = {"maxItems" : 2} >>> Draft3Validator(schema).validate([2, 3, 4]) Traceback (most recent call last): ... ValidationError: [2, 3, 4] is too long
All of the versioned validators <versioned-validators> that
are included with jsonschema adhere to the interface, and implementors
of validators that extend or complement the ones included should adhere
to it as well. For more information see creating-validators.
Validating With Additional Types
Occasionally it can be useful to provide additional or alternate
types when validating the JSON Schema's type property. Validators allow this by taking a
types argument on construction that specifies additional
types, or which can be used to specify a different set of Python types
to map to a given JSON type.
jsonschema tries to
strike a balance between performance in the common case and generality.
For instance, JSON Schema defines a number type, which can
be validated with a schema such as {"type" : "number"}. By
default, this will accept instances of Python number.Number. This
includes in particular ints and floats, along with decimal.Decimal objects, complex numbers etc. For
integer and object, however, rather than
checking for number.Integral and collections.Mapping, jsonschema simply checks for int and dict, since the former can
introduce significant slowdown in these common cases.
If you do want the generality, or just want to add a few
specific additional types as being acceptible for a validator, IValidators have a
types argument that can be used to provide additional or
new types.
class MyInteger(object):
...
Draft3Validator(
schema={"type" : "number"},
types={"number" : (numbers.Number, MyInteger)},
)The list of default Python types for each JSON type is available on
each validator in the IValidator.DEFAULT_TYPES attribute. Note that you
need to specify all types to match if you override one of the existing
JSON types, so you may want to access the set of default types when
specifying your additional type.
Versioned Validators
jsonschema ships
with validators for various versions of the JSON Schema specification.
For details on the methods and attributes that each validator provides
see the IValidator
interface, which each validator implements.
Draft3Validator
Draft4Validator
Validating Formats
JSON Schema defines the format property which can be used to check if
primitive types (strings, numbers,
booleans) conform to well-defined formats. By default, no
validation is enforced, but optionally, validation can be enabled by
hooking in a format-checking object into an IValidator.
>>> validate("localhost", {"format" : "hostname"}) >>> validate( ... "-12", {"format" : "hostname"}, format_checker=FormatChecker(), ... ) Traceback (most recent call last): ... ValidationError: "-12" is not a "hostname"
FormatChecker
checkers
A mapping of currently known formats to tuple of functions that
validate them and errors that should be caught. New checkers can be
added and removed either per-instance or globally for all checkers using
the FormatChecker.checks or FormatChecker.cls_checks
decorators respectively.
cls_checks(format, raises=())
Register a decorated function as globally validating a new format.
Any instance created after this function is called will pick up the supplied checker.
- argument str format
-
the format that the decorated function will check
- argument Exception raises
-
the exception(s) raised by the decorated function when an invalid instance is found. The exception object will be accessible as the
ValidationError.causeattribute of the resulting validation error.
There are a number of default checkers that FormatCheckers know how to
validate. Their names can be viewed by inspecting the FormatChecker.checkers
attribute. Certain checkers will only be available if an appropriate
package is available for use. The available checkers, along with their
requirement (if any,) are listed below.
| Checker | Notes |
|---|---|
hostname ipv4 |
|
ipv6 email |
OS must have |
| uri | requires rfc3987 |
date-time date time regex |
requires isodate |
| color | requires webcolors |