JSON Schema Validator

Define a JSON Schema (Draft-07 / 2020-12) and validate your target JSON data against it in real time.

How to Validate JSON Against a Schema

1

Provide JSON Schema

Paste your JSON Schema definition into the top editor or click Load Sample Schema.

2

Provide Target Data

Paste the target JSON payload you want to test into the data editor.

3

Execute Schema Check

Click Validate JSON against Schema to test compliance and inspect any constraint error paths.

JSON Schema Validator: Practical Guide and Error Troubleshooting

JSON Schema acts as the strict contract for your data payloads. While standard JSON validators only care if your syntax is structurally sound (quotes, brackets, commas), a JSON Schema validator enforces business logic: data types, required fields, value ranges, and payload structure.

When validation fails, it means the incoming or outgoing JSON data deviates from the predefined contract. This usually happens when an API is updated but the client isn't, when dynamic types in a language like Python or JavaScript serialize unexpectedly (e.g., an integer becoming a string), or when developers misunderstand the schema constraints like additionalProperties.

How the Parser Works Under the Hood

Validation engines (such as Ajv in Node.js or jsonschema in Python) typically operate in a highly optimized two-pass architecture:

  1. Schema Compilation: The validator first parses your JSON Schema document. It verifies that the schema itself is valid against a Meta-schema (like Draft-07 or Draft 2020-12). It then compiles this schema into an executable validation function or a set of internal bytecode instructions to maximize validation speed.
  2. Data Evaluation: The engine parses your target JSON data payload into an Abstract Syntax Tree (AST). It traverses this AST recursively, applying the compiled validation rules at each node. If a node violates a constraint (e.g., an array containing 5 items when maxItems is 4), the engine logs the exact JSON pointer path (like #/users/0/age) and throws an error.

Core Syntax Rules to Avoid Failures

  • The $schema declaration: Always include the $schema keyword at the root of your schema to tell the engine which draft specification to use (e.g., [http://json-schema.org/draft-07/schema#](http://json-schema.org/draft-07/schema#)).
  • Strict Type Definitions: The type keyword is absolute. If type: "integer" is defined, passing 1.5 (a number) or "1" (a string) will immediately fail.
  • Required Fields are Arrays: The required keyword expects an array of strings representing property names (e.g., ["id", "name"]), not a boolean value attached to the property itself.
  • No Implicit Fallbacks: If a property is not defined in the properties object but exists in the data, it will be allowed unless you explicitly set "additionalProperties": false at the object level.
  • Nested Object Schemas: If a property is an object, you must explicitly define its type as "object" and provide a nested properties definition.

Common Error Messages and Solutions

Exact Parser Error Message Root Cause Immediate Fix
data.age should be integer A field expected to be an integer received a string, float, or null. Cast the value to an integer in your code before serialization, removing quotes.
data should have required property 'email' The JSON payload is missing a key defined in the schema's required array. Inject the missing key into the JSON object with an appropriate value.
data should NOT have additional properties The payload contains an undocumented field, and additionalProperties is set to false. Remove the extra field from the payload, or add it to the schema's properties.
schema is invalid: data.properties['user'] should be object The schema itself is malformed. A property definition is missing its nested type rules. Ensure the schema defines "type": "object" and maps nested fields under "properties".

Practical Examples: Broken vs. Corrected

The Schema:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "userId": { "type": "integer" },
    "role": { "type": "string", "enum": ["admin", "user"] }
  },
  "required": ["userId", "role"],
  "additionalProperties": false
}

Broken: Type Mismatch and Additional Properties This payload triggers two errors: data.userId should be integer (it was sent as a string) and data should NOT have additional properties (the active flag isn't in the schema).

{
  "userId": "1045",
  "role": "admin",
  "active": true
}

Corrected: Remove the quotes around the integer and drop the undocumented active field to satisfy the strict schema constraints.

{
  "userId": 1045,
  "role": "admin"
}

Command-Line Validation Alternatives

When you need to script this or validate payloads directly from your terminal, leverage CLI wrappers for standard schema validation libraries:

Using Ajv CLI (Node.js ecosystem): Install via npm install -g ajv-cli.

ajv validate -s schema.json -d data.json --all-errors

Using check-jsonschema (Python ecosystem): Install via pip install check-jsonschema.

check-jsonschema --schemafile schema.json data.json

Using validjson (Go ecosystem / fast CLI):

validjson --schema schema.json data.json

Local Development Best Practices

  • Map Schemas in Your IDE: In VS Code, use the .vscode/settings.json file to map specific JSON files to their schemas ("json.schemas": [{ "fileMatch": ["config.json"], "url": "./schema.json" }]). This provides real-time linting and autocomplete before you even run the code.
  • Enforce Strict Mode: When using validators like Ajv in your backend, always instantiate with strict: true. This prevents developers from writing technically valid but logically useless schemas (like typos in keywords such as require instead of required).
  • Implement Pre-commit Hooks: Add schema validation to your pre-commit configuration to ensure developers cannot push configuration files or test mocks that violate the canonical API schemas.
  • Centralize Schema Truth: Do not write schemas manually if you are using OpenAPI/Swagger. Generate your JSON schemas directly from your OpenAPI definitions to prevent configuration drift between your API documentation and actual validation logic.