JSON Tutorial

What Is JSON Schema? Usage, Examples & Complete Tutorial (2026)

About 12 min read

When working with API responses or config files, syntactically valid JSON doesn't mean the data is "legal"—missing fields, wrong types, or out-of-range values often surface only at runtime. JSON Schema is the specification built to solve exactly that. Starting from definition and use cases, this article walks through basic syntax, common keywords, a practical validation workflow, and tool selection to help you build a workable JSON data constraint strategy.

Quick overview

Item Description
Core problem JSON syntax is valid, but structure or values don't match business rules
Approach Declare field types, required fields, and constraints in Schema, then validate automatically
Recommended version Draft 2020-12 (most mature ecosystem support)
This article covers Definition → syntax → keywords → hands-on → selection → FAQ

What is JSON Schema?

JSON Schema is a JSON-based specification for describing what conditions a piece of JSON data must satisfy. Think of it as a type declaration plus constraint rules for data: which fields are required, what type each field is, string length or numeric bounds, and what structure array items should have—all can be written into a Schema.

It is itself a valid JSON document, but with different semantics—Schema doesn't carry business data; it describes the shape of business data. OpenAPI 3.x uses JSON Schema for request/response bodies; many CLI tools validate config files with Schema; frontend form libraries often drive validation from Schema. Once you know it, you can reuse the same constraint definition across frontend, backend, and CI pipelines, reducing duplicated "each layer writes its own validation" work.

Why do you need JSON Schema?

In day-to-day development, JSON.parse() only tells you whether brackets match and quotes are correct. Syntax validation is powerless in cases like these:

  • The API requires an email field, but the response omitted it
  • age should be an integer, but the client sent the string "25"
  • Enum field status received an unexpected value "unknown"
  • Nested object address.zip doesn't match postal code format

The value of JSON Schema is turning those "implicit agreements" into executable, shareable, version-controlled declarations. Teams can check API changes against Schema during code review instead of discovering mismatched fields only during integration or after release.

JSON Schema basics and examples

A minimal Schema declares $schema (the spec version in use) and a root-level type. Below describes a user object: name is a required string; age is an optional non-negative integer.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/user.json",
  "title": "User",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "description": "User full name"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    },
    "email": {
      "type": "string",
      "format": "email"
    }
  },
  "required": ["name"],
  "additionalProperties": false
}

A valid data instance:

{ "name": "John Doe", "age": 28, "email": "john@example.com" }

If you pass { "age": 28 } (missing required name), or { "name": "Jane Doe", "extra": true } (additionalProperties: false forbids extra fields), the validator returns a clear error path and reason.

Common keywords cheat sheet

In Draft 2020-12, the keywords developers use most often are:

Keyword Purpose Sample
type Declare data type "string" / "integer" / "object"
properties Object property definitions { "id": { "type": "integer" } }
required Required field list ["id", "name"]
enum Restrict to enum values ["draft", "published"]
format Common string formats "email" / "date-time"
$ref Reference other Schema fragments "#/$defs/Address"

For complex Schemas, use $defs to split reusable fragments (e.g. Address, Pagination), then reference them with $ref to avoid a bloated single file.

JSON Schema vs JSON syntax validation

They solve problems at different layers; in practice you usually combine both:

  • Syntax validation: brackets, quotes, commas → can JSON.parse
  • Schema validation: fields, types, constraints match agreement → passes business rules

Recommended workflow: paste raw text into JSONSort for formatting and syntax checks, then hand it to ajv, fastjsonschema, or similar for Schema validation. Local tools handle syntax; Schema handles semantics—clear separation of concerns.

Hands-on: API contract validation workflow

For a typical REST project, the full workflow breaks down into four steps:

  1. Define Schema: maintain schemas/user.json in the repo, versioned with OpenAPI or API docs.
  2. Write examples: provide one valid and one invalid sample as unit test fixtures.
  3. CI integration: in PR pipelines, validate mock responses against Schema to prevent accidental field removal or renames.
  4. Runtime safety net: validate request bodies on the server with Schema; return 400 with structured errors instead of writing dirty data to the database.

The core benefit is change visibility: API field changes are caught in CI instead of relying on memory or accidental discovery during integration.

JSON Schema vs other approaches

Approach Pros Limitations
JSON Schema Language-agnostic, native OpenAPI support, mature ecosystem Limited expressiveness for complex rules; learning curve
TypeScript types Great IDE experience, compile-time checks TS ecosystem only; runtime needs extra conversion
Hand-written if/else validation Flexible, no extra dependencies Hard to maintain, reuse, and easy to miss edge cases
Protobuf / Avro Strong typing, high-performance serialization Requires a compile step; not ideal for pure JSON API scenarios

If your API is already JSON + OpenAPI, JSON Schema is usually the lowest-friction choice; if you're full-stack TypeScript and don't need cross-language contracts, lead with TS and use Schema as a supplement.

Is JSON Schema worth the investment?

Scenarios worth investing in:

  • Public APIs that need a machine-readable contract shared with consumers
  • Complex config structures where format errors should be caught before deploy
  • Multiple clients (Web / mobile / backend) sharing the same data constraints
  • Automated CI detection of breaking API changes

Scenarios where you can wait:

  • Occasionally formatting or viewing JSON → JSONSort is enough
  • Very simple, stable data structures → hand-written validation may cost less
  • No OpenAPI / contract testing workflow → establish documentation habits before introducing Schema

FAQ

What is JSON Schema?

JSON Schema is a rule set for describing JSON structure and constraints. It is a JSON document used to declare field types, required fields, value ranges, and more, so validators can automatically judge whether data is valid.

What's the difference between JSON Schema and JSON?

JSON carries business data; JSON Schema describes what that data should look like. Analogy: JSON is the "instance"; Schema is the "mold."

Which version should I choose?

New projects should prefer Draft 2020-12. Existing projects on Draft-07 / 2019-09 need not migrate unless you depend on newer keywords.

How do I validate locally?

Use JSONSort for formatting and syntax checks; use ajv (Node.js), jsonschema (Python), or VS Code's JSON Schema extension for Schema validation.

How do OpenAPI and JSON Schema relate?

OpenAPI 3.x request/response body definitions are based on a JSON Schema subset with extensions. Writing OpenAPI docs is essentially writing Schema.

Conclusion

JSON Schema doesn't answer "can JSON parse?"—it answers "does the data match team agreements?" From definition and syntax to CI integration, its value is turning implicit rules into explicit, executable contracts. Start with a small API or config file, write your first Schema and wire up validation, then expand across the project.

Further reading

Changelog: initial release