Advanced JSON Schema Validator Techniques for Power Users
Once you're comfortable with basic validation, these advanced techniques will help you handle complex validation scenarios and integrate validation deeply into your systems.
1. Conditional Validation with if/then/else
The most powerful feature in modern JSON Schema is conditional validation. Use it to enforce different rules based on the data itself:
{
"type": "object",
"properties": {
"type": { "type": "string", "enum": ["individual", "business"] },
"taxId": { "type": "string" },
"businessName": { "type": "string" }
},
"allOf": [
{
"if": {
"properties": { "type": { "const": "business" } }
},
"then": {
"required": ["taxId", "businessName"]
},
"else": {
"properties": {
"taxId": { "not": {} },
"businessName": { "not": {} }
}
}
}
]
}
This schema makes taxId and businessName required only when type is "business". For individual accounts, those fields must not be present.
2. Custom Error Messages with Error Message Extension
Enhance validation with user-friendly error messages that guide users toward correct input:
{
"type": "object",
"properties": {
"password": {
"type": "string",
"minLength": 8,
"pattern": "^(?=.*[A-Z])(?=.*[0-9])",
"errorMessage": {
"minLength": "Password must be at least 8 characters",
"pattern": "Password must contain at least one uppercase letter and one number"
}
}
}
}
While not part of the core JSON Schema spec, many validators (including AJV) support the errorMessage keyword for better user-facing error reporting.
3. Schema Composition with allOf, anyOf, and oneOf
Combine multiple schemas to create sophisticated validation rules:
{
"allOf": [
{ "$ref": "#/$defs/baseUser" },
{ "$ref": "#/$defs/withTimestamp" },
{
"if": {
"properties": { "role": { "const": "admin" } }
},
"then": { "$ref": "#/$defs/adminPrivileges" }
}
]
}
- allOf: Data must match ALL sub-schemas (intersection)
- anyOf: Data must match AT LEAST ONE sub-schema (union)
- oneOf: Data must match EXACTLY ONE sub-schema (exclusive choice)
4. Data-Driven Validation Patterns
Use validation as a debugging tool by testing hypotheses about your data:
Pattern 1: Structure Discovery
Pass unknown data through an empty schema, then incrementally add constraints based on validation errors. Each error reveals something about the data's actual structure.
Pattern 2: Regression Testing
Store previously validated data samples. After schema changes, re-validate all historical samples to catch unintended breaking changes.
Pattern 3: Schema Profiling
Collect validation results over time and identify which constraints fail most frequently. This data guides schema optimization and reveals common data entry errors.
5. Programmatic Validation Pipelines
Build automated validation pipelines that process data through multiple validation stages:
// Multi-stage validation pipeline
const pipeline = [
{ stage: 'syntax', validator: validateSyntax },
{ stage: 'schema', validator: validateAgainstSchema },
{ stage: 'business', validator: validateBusinessRules },
{ stage: 'integrity', validator: validateCrossReferences }
];
async function validateData(data, pipeline) {
const results = [];
for (const { stage, validator } of pipeline) {
const result = await validator(data);
results.push({ stage, valid: result.valid, errors: result.errors });
if (!result.valid && stage === 'syntax') break; // Halt on syntax errors
}
return results;
}
6. Live Schema Monitoring
Implement real-time validation monitoring for production systems:
// Monitor validation failures in production
const validationMetrics = {
totalChecks: 0,
failures: 0,
topErrors: new Map()
};
function monitoredValidate(schema, data) {
validationMetrics.totalChecks++;
const result = validate(schema, data);
if (!result.valid) {
validationMetrics.failures++;
result.errors.forEach(err => {
const key = `${err.keyword}:${err.instancePath}`;
validationMetrics.topErrors.set(
key,
(validationMetrics.topErrors.get(key) || 0) + 1
);
});
}
return result;
}
7. Cross-Schema Reference Validation
Validate relationships between multiple data objects that reference each other:
{
"type": "object",
"properties": {
"users": {
"type": "array",
"items": { "$ref": "#/$defs/user" }
},
"orders": {
"type": "array",
"items": {
"allOf": [
{ "$ref": "#/$defs/order" },
{
"properties": {
"userId": {
"type": "integer"
}
}
}
]
}
}
}
}
Summary
Advanced validation techniques transform a simple checker into a powerful data quality system. Conditional validation handles complex business rules, schema composition enables modular design, and programmatic pipelines automate validation at scale.
Check out xingdian.net's JSON Schema Validator for free online processing.
Top comments (0)