jsonschema

JSON Schema validation functions for PostgreSQL

Overview

PackageVersionCategoryLicenseLanguage
jsonschema0.1.9FEATMITRust
IDExtensionBinLibLoadCreateTrustRelocSchema
2760jsonschemaNoYesNoYesNoYes-
Relatedpg_jsonschema jsquery pg_graphql plv8

Distinct from Supabase pg_jsonschema; pgrx patched to 0.18.1.

Version

TypeRepoVersionPG VerPackageDeps
EXTPIGSTY0.1.91817161514jsonschema-
RPMPIGSTY0.1.91817161514jsonschema_$v-
DEBPIGSTY0.1.91817161514postgresql-$v-jsonschema-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u22.x86_64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u22.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u24.x86_64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u24.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
u26.x86_64
u26.aarch64
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9
PIGSTY 0.1.9

Build

You can build the RPM / DEB packages for jsonschema using pig build:

pig build pkg jsonschema         # build RPM / DEB packages

Install

You can install jsonschema directly. First, make sure the PGDG and PIGSTY repositories are added and enabled:

pig repo add pgsql -u          # Add repo and update cache

Install the extension using pig or apt/yum/dnf:

pig install jsonschema;          # Install for current active PG version
pig ext install -y jsonschema -v 18  # PG 18
pig ext install -y jsonschema -v 17  # PG 17
pig ext install -y jsonschema -v 16  # PG 16
pig ext install -y jsonschema -v 15  # PG 15
pig ext install -y jsonschema -v 14  # PG 14
dnf install -y jsonschema_18       # PG 18
dnf install -y jsonschema_17       # PG 17
dnf install -y jsonschema_16       # PG 16
dnf install -y jsonschema_15       # PG 15
dnf install -y jsonschema_14       # PG 14
apt install -y postgresql-18-jsonschema   # PG 18
apt install -y postgresql-17-jsonschema   # PG 17
apt install -y postgresql-16-jsonschema   # PG 16
apt install -y postgresql-15-jsonschema   # PG 15
apt install -y postgresql-14-jsonschema   # PG 14

Create Extension:

CREATE EXTENSION jsonschema;

Source: jsonschema v0.1.9 README, documentation, control file, SQL definition.

Usage

jsonschema validates JSON and JSONB values against JSON Schema inside PostgreSQL. It is the theory/pg-jsonschema-boon extension and is distinct from Supabase pg_jsonschema, although it provides compatibility wrappers named json_matches_schema() and jsonb_matches_schema().

The extension supports JSON Schema draft 4, draft 6, draft 7, draft 2019-09, and draft 2020-12 through the Rust boon validator. It has no runtime dependency beyond PostgreSQL.

Validate a Schema and a Document

CREATE EXTENSION IF NOT EXISTS jsonschema;

SELECT jsonschema_is_valid(
  '{
     "type": "object",
     "required": ["name", "email"],
     "properties": {
       "name":  { "type": "string" },
       "age":   { "type": "number", "minimum": 0 },
       "email": { "type": "string", "format": "email" }
     }
   }'::json
);

SELECT jsonschema_validates(
  '{"name":"Amos Burton","email":"[email protected]"}'::json,
  '{
     "type": "object",
     "required": ["name", "email"],
     "properties": {
       "name":  { "type": "string" },
       "email": { "type": "string", "format": "email" }
     }
   }'::json
);

jsonschema_is_valid(schema) returns whether the schema itself compiles and validates against the selected draft. jsonschema_validates(data, schema) returns whether the JSON/JSONB value satisfies the schema.

Check Constraints

CREATE TABLE customer_profile (
  id       bigserial PRIMARY KEY,
  profile  jsonb NOT NULL,
  CHECK (
    jsonschema_validates(
      profile,
      '{
         "type": "object",
         "required": ["email"],
         "properties": {
           "email": { "type": "string", "format": "email" },
           "tags":  {
             "type": "array",
             "items": { "type": "string", "maxLength": 16 }
           }
         }
       }'::jsonb
    )
  )
);

Use constraints when the database should reject malformed JSON documents at write time.

Composed Schemas

SELECT jsonschema_validates(
  jsonb_build_object(
    'first_name', 'Naomi',
    'last_name', 'Nagata',
    'shipping_address', jsonb_build_object(
      'street_address', '1 Rocinante Way',
      'city', 'Ceres Station',
      'state', 'The Belt'
    )
  ),
  'https://example.com/schemas/customer',
  '{
     "$id": "https://example.com/schemas/address",
     "type": "object",
     "required": ["street_address", "city", "state"],
     "properties": {
       "street_address": { "type": "string" },
       "city": { "type": "string" },
       "state": { "type": "string" }
     }
   }'::jsonb,
  '{
     "$id": "https://example.com/schemas/customer",
     "type": "object",
     "required": ["first_name", "last_name", "shipping_address"],
     "properties": {
       "first_name": { "type": "string" },
       "last_name": { "type": "string" },
       "shipping_address": { "$ref": "/schemas/address" }
     }
   }'::jsonb
);

The id overloads let multiple schemas reference each other by $id, which is useful for componentized JSON Schema definitions.

Compatibility Functions

SELECT json_matches_schema(
  '{"type":"string","maxLength":4}'::json,
  '"1234"'::json
);

SELECT jsonb_matches_schema(
  '{"type":"object","required":["id"]}'::json,
  '{"id":42}'::jsonb
);

These wrappers mirror the common pg_jsonschema argument order: schema first, instance second.

Draft Selection and Caveats

SET jsonschema.default_draft = 'V2020';
SET jsonschema.default_draft = 'V7';

If a schema omits $schema, jsonschema.default_draft controls the default draft. Supported values are V4, V6, V7, V2019, and V2020.

  • jsonschema_validates(data, schema) returns NULL if either argument is NULL.
  • Invalid or uncompilable schemas can raise errors in validation calls; failed document validation returns false and logs details at INFO.
  • jsonschema_is_valid(id, VARIADIC schemas) and jsonschema_validates(data, id, VARIADIC schemas) require matching $id values for reliable composed-schema resolution.