NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1423 most downloaded on crates.io
An implementation-agnostic JSON reference resolution library for Rust.
Last release 4 days ago
02 Oct 2026
Ships fairly regularly
a new release about every 9 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
96 releases · first in 2024
One column per month.
Deprecated PrimitiveType & PrimitiveTypesBitMap.
$ref chains (e.g., a -> b -> a).$ref resolution within fragment-extracted external resources. #892PrimitiveType & PrimitiveTypesBitMap.External resources not discovered within subresources of local $ref targets. #892
$ref targets. #892JsonTypeSet::len() and JsonTypeSet::remove() helpers for managing type sets.
JsonTypeSet::len() and JsonTypeSet::remove() helpers for managing type sets.$ref references. #892Stack overflow on empty $ref value. #886
$ref value. #886evaluate() top-level function for convenient access to structured validation output.
evaluate() top-level function for convenient access to structured validation output.contentEncoding values per RFC 4648: base64url, base32, base32hex, and base16. These encodings are now validated alongside the existing base64 support in Draft 6 and 7. #26validator.iter_errors(instance).into_errors(). It returns a ValidationErrors type that collects validation errors and implements std::error::Error. #451ValidationError fields are private; use instance(), kind(), instance_path(), and schema_path() instead of accessing struct fields directly.ErrorIterator is now a newtype wrapper instead of Box<dyn ValidationErrorIterator>.validate and other APIs returning Result<_, ValidationError> are 5–10% faster in some workloads due to the smaller error handle.evaluate: Avoiding deep clones of unmatched keyword values (e.g., title, description, examples) on every schema node evaluation by using Arc internally. Can be multiple times faster for schemas with large annotations.CLI: Structured --output flag|list|hierarchical modes now stream newline-delimited JSON records with schema/instance metadata plus JSON Schema Output
--output flag|list|hierarchical modes now stream newline-delimited JSON records with schema/instance metadata plus JSON Schema Output v1 payloads (default text output remains human-readable).--errors-only flag to suppress successful validation output and only show failures.Validator::evaluate() API exposes JSON Schema Output v1 (flag/list/hierarchical) reports along with iterator helpers for annotations and errors.meta::validator_for() function to build validators for meta-schema validation with full Validator API access.Validator now implements Clone. #809Validator::apply(), Output, and BasicOutput types have been removed in favor of the richer evaluate() API.BREAKING: primitive_type module (deprecated since 0.30.0). Use jsonschema::types instead.
$schema URIs can now be used by registering their meta-schemas in the Registry via jsonschema::options().with_registry(). #664arbitrary-precision feature for exact numeric validation of large integers and decimals beyond standard floating-point limits. #103$schema URIs for drafts 04, 06, and 07 (e.g., https://json-schema.org/draft-07/schema). #802meta::is_valid now panics for unknown $schema values instead of defaulting to Draft 2020-12. meta::validate returns an error for unknown $schema values. Use meta::options().with_registry() to validate schemas against custom meta-schemas.Resource::from_contents no longer returns Result and always succeeds, since draft detection no longer fails for unknown $schema values.meta::try_is_valid and meta::try_validate. Use meta::is_valid and meta::validate instead.primitive_type module (deprecated since 0.30.0). Use jsonschema::types instead.required: short-circuit when the instance object has fewer properties than required keys.BREAKING: BasicOutput and Annotations no longer have lifetime parameters. Update type annotations from BasicOutput<'a> to BasicOutput and Annotations<
BasicOutput and Annotations no longer have lifetime parameters. Update type annotations from BasicOutput<'a> to BasicOutput and Annotations<'a> to Annotations.referencing: URI caching now avoids hash collisions and reduces lock contention.fluent-uri to 0.4.1.1.83.0.Send + Sync bounds from Retrieve/AsyncRetrieve on wasm32.draftX::meta::validator() helper so meta-schema validators lazy-init on wasm32 while native targets keep borrowing the cached jsonschema::meta::MetaValidator.xn-- labels, reject leading combining marks/uppercase prefixes, and enforce the latest JSON Schema punycode context rules.wasm32-unknown-unknown support. #785apply now reuses cached schema locations, URI fragments, and buffers for up to ~2.5x faster validation.$ref compilation deduplicates validator nodes, which decreases the memory usage and improves performance.apply on location-heavy workloads.unevaluatedProperties validation is 25-35% faster through optimized property marking and early-exit paths.unevaluatedProperties memory usage drastically reduced by eliminating redundant registry clones during compilation.unevaluatedItems validation is ~10% faster through early-exit optimizations and eliminating redundant validations in combinators.Validator::config to reduce the memory footprint.DRAFT4_META_VALIDATOR, DRAFT6_META_VALIDATOR, DRAFT7_META_VALIDATOR, DRAFT201909_META_VALIDATOR, and DRAFT202012_META_VALIDATOR statics. Use draftX::meta::validator() helper functions instead (e.g., draft7::meta::validator()).BREAKING: instance_path segments are now unescaped when iterating. LocationSegment::Property now holds Cow<'_, str> and LocationSegment is no longer C
instance_path segments are now unescaped when iterating. LocationSegment::Property now holds Cow<'_, str> and LocationSegment is no longer Copy. #788### Changed - Bump fancy-regex to 0.16.
fancy-regex to 0.16.Added missing context field to ValidationErrorKind::OneOfMultipleValid.
context field to ValidationErrorKind::OneOfMultipleValid.enum.CLI: flag -d, --draft <4|6|7|2019|2020> to enforce a specific JSON Schema draft.
-d, --draft <4|6|7|2019|2020> to enforce a specific JSON Schema draft.--assert-format and --no-assert-format to toggle validation of format keywords.context for ValidationErrorKind::AnyOf and ValidationErrorKind::OneOfNotValid which contains errors for all subschemas, each inside a separate vector with an index matching subschema ID.multipleOf for float values.fancy-regex to 0.15.ValidationOptions::with_base_uri that allows for specifying a base URI for all relative references in the schema.
JsonType and JsonTypeSet.ValidationOptions::with_base_uri that allows for specifying a base URI for all relative references in the schema.pattern and patternProperties keywords.$ref without base URI.$ref. #725PrimitiveType and PrimitiveTypesBitMap.Hash, PartialOrd, Ord and serde::Serialize for Location.
Hash, PartialOrd, Ord and serde::Serialize for Location.Location::join public.All builder methods on ValidationOptions now take ownership of self instead of &mut self. This change enables better support for non-blocking retrieva
All builder methods on ValidationOptions now take ownership of self instead of &mut self.
This change enables better support for non-blocking retrieval of external resources during the process of building a validator.
Update your code to chain the builder methods instead of reusing the options instance:
// Before (0.28.x)
let mut options = jsonschema::options();
options.with_draft(Draft::Draft202012);
options.with_format("custom", my_format);
let validator = options.build(&schema)?;
// After (0.29.0)
let validator = jsonschema::options()
.with_draft(Draft::Draft202012)
.with_format("custom", my_format)
.build(&schema)?;
The Retrieve trait's retrieve method now accepts URI references as &Uri<String> instead of &Uri<&str>.
This aligns with the async version and simplifies internal URI handling. The behavior and available methods remain the same, this is purely a type-level change.
// Before
fn retrieve(&self, uri: &Uri<&str>) -> Result<Value, Box<dyn std::error::Error + Send + Sync>>
// After
fn retrieve(&self, uri: &Uri<String>) -> Result<Value, Box<dyn std::error::Error + Send + Sync>>
Simplified Registry creation API:
RegistryOptions::try_new and RegistryOptions::try_from_resources in favor of Registry::buildRegistry::try_with_resource_and_retriever - use Registry::options().retriever() instead// Before (0.28.x)
let registry = Registry::options()
.draft(Draft::Draft7)
.try_new(
"http://example.com/schema",
resource
)?;
let registry = Registry::options()
.draft(Draft::Draft7)
.try_from_resources([
("http://example.com/schema", resource)
].into_iter())?;
let registry = Registry.try_with_resource_and_retriever(
"http://example.com/schema",
resource,
retriever
)?;
// After (0.29.0)
let registry = Registry::options()
.draft(Draft::Draft7)
.build([
("http://example.com/schema", resource)
])?;
let registry = Registry::options()
.draft(Draft::Draft7)
.build([
("http://example.com/schema", resource)
])?;
let registry = Registry::options()
.retriever(retriever)
.build(resources)?;
resolve-async feature. #385referencing::Registry as jsonschema::Registry.ValidationOptions::with_registry that allows for providing a predefined referencing::Registry. #682Panic when schema registry base URI contains an unencoded fragment.
Resolving external references that nested inside local references. #671
Handle fragment references within $id-anchored subschemas. #640
$id-anchored subschemas. #640Implement IntoIterator for Location to iterate over LocationSegment.
IntoIterator for Location to iterate over LocationSegment.FromIter for Location to build a Location from an iterator of LocationSegment.ValidationError::to_owned method for converting errors into owned versions.Implement ExactSizeIterator for PrimitiveTypesBitMapIterator.
ExactSizeIterator for PrimitiveTypesBitMapIterator.Added masked() and masked_with() methods to ValidationError to support hiding sensitive data in error messages. #434
masked() and masked_with() methods to ValidationError to support hiding sensitive data in error messages. #4341.71.1.### Documentation - Fix documentation for validate
validateReturn "Unknown specification" error on https-prefixed $schema for Draft 4, 5, 6. #629
https-prefixed $schema for Draft 4, 5, 6. #629Important: This release contains breaking changes. See the Migration Guide for details on transitioning to the new API.
Important: This release contains breaking changes. See the Migration Guide for details on transitioning to the new API.
Validator::iter_errors that iterates over all validation errors.ValidationErrorKind::JSONParse, ValidationErrorKind::InvalidReference, ValidationErrorKind::Schema, ValidationErrorKind::FileNotFound and ValidationErrorKind::Utf8.Validator::validate now returns the first error instead of an iterator in the Err variant.Re-export referencing::Error as ReferencingError. #614
referencing::Error as ReferencingError. #614Important: This release removes deprecated old APIs. See the Migration Guide for details on transitioning to the new API.
Important: This release removes deprecated old APIs. See the Migration Guide for details on transitioning to the new API.
draft201909, draft202012, and cli features.CompilationOptions, JSONSchema, PathChunkRef, JsonPointerNode, and SchemaResolverError aliases.jsonschema::compile, Validator::compile, ValidationOptions::compile, ValidationOptions::with_resolver, ValidationOptions::with_meta_schemas, ValidationOptions::with_document functions.SchemaResolver trait.Infinite recursion when using mutually recursive $ref in unevaluatedProperties.
$ref in unevaluatedProperties.Infinite recursion in some cases. #146
$ref interaction with $recursiveAnchor in Draft 2019-09.unevaluatedProperties with $recursiveRef & $dynamicRef.Incomplete external reference resolution.
Support $ref, $recursiveRef, and $dynamicRef in unevaluatedItems. #287
Partial support for unevaluatedItems, excluding references.
unevaluatedItems, excluding references.JsonPointer in favor of Location.PathChunkRef in favor of LocationSegment.JsonPointerNode in favor of LazyLocation.$ref or $dynamicRef).hostname & idn-hostname formats validation.apply.JsonPointerNode::to_vec without a replacement.### Performance - Speedup resolving.
Speedup json-pointer and relative-json-pointer formats validation.
json-pointer and relative-json-pointer formats validation.### Fixed - Removed dbg! macro.
dbg! macro.BREAKING: Custom retrievers now receive &Uri<&str> instead of &UriRef<&str>
&Uri<&str> instead of &UriRef<&str>once_cell to 1.20.regex to 1.11.time format validation (leap seconds and second fractions).duration format validation.$id without base. #547hostname format validation (double dot).idn-hostname format validation. #101hostname, date, time, date-time, and duration formats validation.pattern. #417Important: This release brings a complete rework of reference resolving which deprecates some older APIs. While backward compatibility is maintained f…
Important: This release brings a complete rework of reference resolving which deprecates some older APIs. While backward compatibility is maintained for now, users are encouraged to update their code. See the Migration Guide for details on transitioning to the new API.
$anchor support.$recursiveRef & $recursiveAnchor support in Draft 2019-09.$dynamicRef & $dynamicAnchor support in Draft 2020-12.$ref as URI, not URL, and additionally normalize them. #454$id. #264SchemaResolver trait and SchemaResolverError in favor of a simpler Retrieve that works with Box<dyn std::error::Error>.
In turn, it also deprecates ValidationOptions::with_resolver in favor of ValidationOptions::with_retrieverValidationOptions::with_document in favor of ValidationOptions::with_resource.unevaluatedProperties. #420iri & iri-reference validation.uri, iri, uri-reference, and iri-reference formats.Your coding agent can read these notes before it upgrades. Set up the MCP server →