Dispatch model
ValidationService.validate(data, schema) chooses validator by SchemaType using ValidatorDispatcher:
OBJECT->ObjectValidatorARRAY->ArrayValidator- other types ->
PrimitiveValidator
Object validation order
ObjectValidator evaluates in this order:
- Resolve
$refwhen schema is reference and resolver is wired. - Resolve
$dynamicRefif present and no static reference. - Ensure data is
Map<?, ?>(null values are skipped). - Composition and conditionals (order is as follows):
allOf: all subschemas must pass.anyOf: at least one subschema must pass.oneOf: exactly one subschema must pass.not: instance must NOT match the subschema.if/then/else: branch according to theifcondition.
- Validate required fields.
- Validate declared
propertiesthat exist in input. - Validate unknown keys with
patternProperties(regex matches). - If still unmatched, enforce
additionalProperties(boolean or schema). - Finally, enforce
unevaluatedPropertiesfor any property not covered by steps 6–8.
Array validation order
ArrayValidator evaluates in this order:
- Ensure data is
List<?>. - Apply
minItemsandmaxItemsconstraints. - Apply
uniqueItemsconstraint. - Validate
prefixItemsschemas for the first N items (tuple validation). - Apply
additionalItemsschema to items beyondprefixItems(if defined). - Validate
containswithminContains/maxContains. - Validate items using
itemsschema (applies to all items ifprefixItemsnot defined, or to items beyondprefixItemsif present). - Enforce
unevaluatedItemsfor items not covered byprefixItems,items,contains.
Primitive validation details
Type checks
numberaccepts any JavaNumber.integeraccepts integral numbers (Integer,Long, etc., or decimal with zero fraction).nullrequiresnullvalue.anyalways passes.
Rule order
- Type check first.
enumcheck next.- If
enumexists and fails, remaining primitive constraints are not evaluated. - Numeric/string/format constraints run after successful type and enum checks.
Error model
- Validators return
List<ValidationError>. ValidationResult.from(errors)marks success if list is empty.- Each
ValidationErrorincludes:nodePathexpectedTypeactualTypedescription
Compact format returned to Skript expression:
[nodePath] expectedType: actualType - description
Known runtime constraints
- Data loader in Skript integration parses root as
Map<String, Object>.
Related pages
- Keyword support scope: Schema keywords
- Syntax contract and path behavior: Skript API
- Practical recipes: Examples