A JSON Schema validator implementation. It compiles schema into a validation tree to have validation as fast as possible.
Supported drafts:
- Draft 7 (except optional
idn-hostname.json
test case) - Draft 6
- Draft 4 (except optional
bignum.json
test case)
# Cargo.toml
jsonschema = "0.12"
To validate documents against some schema and get validation errors (if any):
use jsonschema::{Draft, JSONSchema};
use serde_json::json;
fn main() {
let schema = json!({"maxLength": 5});
let instance = json!("foo");
let compiled = JSONSchema::compile(&schema)
.expect("A valid schema");
let result = compiled.validate(&instance);
if let Err(errors) = result {
for error in errors {
println!("Validation error: {}", error);
println!(
"Instance path: {}", error.instance_path
);
}
}
}
Each error has an instance_path
attribute that indicates the path to the erroneous part within the validated instance.
It could be transformed to JSON Pointer via .to_string()
or to Vec<String>
via .into_vec()
.
If you only need to know whether document is valid or not (which is faster):
use jsonschema::is_valid;
use serde_json::json;
fn main() {
let schema = json!({"maxLength": 5});
let instance = json!("foo");
assert!(is_valid(&schema, &instance));
}
Or use a compiled schema (preferred):
use jsonschema::{Draft, JSONSchema};
use serde_json::json;
fn main() {
let schema = json!({"maxLength": 5});
let instance = json!("foo");
// Draft is detected automatically
// with fallback to Draft7
let compiled = JSONSchema::compile(&schema)
.expect("A valid schema");
assert!(compiled.is_valid(&instance));
}
This library is functional and ready for use, but its API is still evolving to the 1.0 API.
- Python - See the
./bindings/python
directory - Ruby - a crate by @driv3r
There is a comparison with other JSON Schema validators written in Rust - jsonschema_valid==0.4.0
and valico==3.6.0
.
Test machine i8700K (12 cores), 32GB RAM.
Input values and schemas:
- Zuora OpenAPI schema (
zuora.json
). Validated against OpenAPI 3.0 JSON Schema (openapi.json
). - Kubernetes Swagger schema (
kubernetes.json
). Validated against Swagger JSON Schema (swagger.json
). - Canadian border in GeoJSON format (
canada.json
). Schema is taken from the GeoJSON website (geojson.json
). - Concert data catalog (
citm_catalog.json
). Schema is inferred via infers-jsonschema & manually adjusted (citm_catalog_schema.json
). Fast
is taken from fastjsonschema benchmarks (fast_schema.json
,fast_valid.json
andfast_invalid.json
).
Case | Schema size | Instance size |
---|---|---|
OpenAPI | 18 KB | 4.5 MB |
Swagger | 25 KB | 3.0 MB |
Canada | 4.8 KB | 2.1 MB |
CITM catalog | 2.3 KB | 501 KB |
Fast (valid) | 595 B | 55 B |
Fast (invalid) | 595 B | 60 B |
Here is the average time for each contender to validate Ratios are given against compiled JSONSchema
using its validate
method. The is_valid
method is faster, but gives only a boolean return value:
Case | jsonschema_valid | valico | jsonschema (validate) | jsonschema (is_valid) |
---|---|---|---|---|
OpenAPI | - (1) | - (1) | 1.704 ms | 1.651 ms (x0.96) |
Swagger | - (2) | 97.401 ms (x18.37) | 5.234 ms | 3.507 ms (x0.66) |
Canada | 45.555 ms (x39.20) | 164.12 ms (x141.23) | 1.162 ms | 1.165 ms (x1.00) |
CITM catalog | 6.107 ms (x2.28) | 15.233 ms (x5.69) | 2.677 ms | 755.58 us (x0.28) |
Fast (valid) | 2.04 us (x5.67) | 3.70 us (x10.28) | 359.59 ns | 93.40 ns (x0.25) |
Fast (invalid) | 397.52 ns (x0.81) | 3.78 us (x7.75) | 487.25 ns | 5.15 ns (x0.01) |
Notes:
-
jsonschema_valid
andvalico
do not handle valid path instances matching the^\\/
regex. -
jsonschema_valid
fails to resolve local references (e.g.#/definitions/definitions
).
You can find benchmark code in benches/jsonschema.rs
, Rust version is 1.51
.
If you have anything to discuss regarding this library, please, join our gitter!