jsonschema-rs
A high-performance JSON Schema validator for Python.
import jsonschema_rs
schema = {"maxLength": 5}
instance = "foo"
try:
jsonschema_rs.validate(schema, "incorrect")
except jsonschema_rs.ValidationError as exc:
assert str(exc) == '''"incorrect" is longer than 5 characters
Failed validating "maxLength" in schema
On instance:
"incorrect"'''
validator = jsonschema_rs.validator_for(schema)
for error in validator.iter_errors(instance):
print(f"Error: {error}")
print(f"Location: {error.instance_path}")
assert validator.is_valid(instance)
⚠️ Upgrading from older versions? Check our Migration Guide for key changes.
Highlights
- 📚 Full support for popular JSON Schema drafts
- 🌐 Remote reference fetching (network/file)
- 🔧 Custom format validators
Supported drafts
The following drafts are supported:
You can check the current status on the Bowtie Report.
Limitations
- No support for arbitrary precision numbers
Installation
To install jsonschema-rs
via pip
run the following command:
pip install jsonschema-rs
Usage
If you have a schema as a JSON string, then you could pass it to validator_for
to avoid parsing on the Python side:
import jsonschema_rs
validator = jsonschema_rs.validator_for('{"minimum": 42}')
...
You can use draft-specific validators for different JSON Schema versions:
import jsonschema_rs
validator = jsonschema_rs.validator_for({"minimum": 42})
validator = jsonschema_rs.Draft7Validator({"minimum": 42})
validator = jsonschema_rs.Draft201909Validator({"minimum": 42})
validator = jsonschema_rs.Draft202012Validator({"minimum": 42})
JSON Schema allows for format validation through the format
keyword. While jsonschema-rs
provides built-in validators for standard formats, you can also define custom format validators
for domain-specific string formats.
To implement a custom format validator:
- Define a function that takes a
str
and returns a bool
. - Pass it with the
formats
argument. - Ensure validate_formats is set appropriately (especially for Draft 2019-09 and 2020-12).
import jsonschema_rs
def is_currency(value):
return len(value) == 3 and value.isascii()
validator = jsonschema_rs.validator_for(
{"type": "string", "format": "currency"},
formats={"currency": is_currency},
validate_formats=True
)
validator.is_valid("USD")
validator.is_valid("invalid")
Additional configuration options are available for fine-tuning the validation process:
validate_formats
: Override the draft-specific default behavior for format validation.ignore_unknown_formats
: Control whether unrecognized formats should be reported as errors.
Example usage of these options:
import jsonschema_rs
validator = jsonschema_rs.Draft202012Validator(
{"type": "string", "format": "date"},
validate_formats=True,
ignore_unknown_formats=False
)
validator.is_valid("2023-05-17")
validator.is_valid("not a date")
invalid_schema = {"type": "string", "format": "unknown"}
jsonschema_rs.Draft202012Validator(invalid_schema, ignore_unknown_formats=False)
Performance
jsonschema-rs
is designed for high performance, outperforming other Python JSON Schema validators in most scenarios:
- Up to 60-390x faster than
jsonschema
for complex schemas and large instances - Generally 3-7x faster than
fastjsonschema
on CPython
For detailed benchmarks, see our full performance comparison.
Python support
jsonschema-rs
supports CPython 3.8, 3.9, 3.10, 3.11, 3.12, and 3.13.
Acknowledgements
This library draws API design inspiration from the Python jsonschema
package. We're grateful to the Python jsonschema
maintainers and contributors for their pioneering work in JSON Schema validation.
Support
If you have questions, need help, or want to suggest improvements, please use GitHub Discussions.
If you find jsonschema-rs
useful, please consider sponsoring its development.
Contributing
We welcome contributions! Here's how you can help:
See CONTRIBUTING.md for more details.
License
Licensed under MIT License.