Skip to main content

Validators for JSON Structure schemas and instances

Project description

JSON Structure Python SDK

PyPI version Python License: MIT

Python validators for JSON Structure schemas and instances.

JSON Structure is a type-oriented schema language for JSON, designed for defining data structures that can be validated and mapped to programming language types.

Installation

pip install json-structure

Quick Start

Validate a Schema

from json_structure import SchemaValidator

schema = {
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://example.com/person",
    "name": "Person",
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "int32"},
        "email": {"type": "string"}
    },
    "required": ["name"]
}

validator = SchemaValidator()
errors = validator.validate(schema)

if errors:
    print("Schema is invalid:")
    for error in errors:
        print(f"  - {error}")
else:
    print("Schema is valid!")

Validate an Instance

from json_structure import InstanceValidator

schema = {
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://example.com/person",
    "name": "Person",
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "int32"}
    },
    "required": ["name"]
}

instance = {
    "name": "Alice",
    "age": 30
}

validator = InstanceValidator(schema)
errors = validator.validate_instance(instance)

if errors:
    print("Instance is invalid:")
    for error in errors:
        print(f"  - {error}")
else:
    print("Instance is valid!")

Features

Supported Types

All 34 types from JSON Structure Core v0 are supported:

Primitive Types:

  • string, number, integer, boolean, null
  • int8, uint8, int16, uint16, int32, uint32
  • int64, uint64, int128, uint128 (string-encoded)
  • float8, float, double, decimal
  • date, datetime, time, duration
  • uuid, uri, binary, jsonpointer

Compound Types:

  • object, array, set, map, tuple, choice, any

Extensions

  • Conditional Composition: allOf, anyOf, oneOf, not, if/then/else
  • Validation Addins: minimum, maximum, minLength, maxLength, pattern, etc.
  • Import Extension: $import, $importdefs for schema composition

Command Line Tools

# Validate a schema file
json-structure-check schema.json

# Validate an instance against a schema
json-structure-validate instance.json schema.json

API Reference

SchemaValidator

from json_structure import SchemaValidator

validator = SchemaValidator(
    allow_dollar=False,      # Allow '$' in property names
    allow_import=False,      # Enable $import/$importdefs
    import_map=None,         # Dict mapping URIs to local files
    extended=False,          # Enable extended validation features
    external_schemas=None    # List of schema dicts to sideload (matched by $id)
)

errors = validator.validate(schema_dict, source_text=None)

InstanceValidator

from json_structure import InstanceValidator

validator = InstanceValidator(
    root_schema,             # The JSON Structure schema dict
    allow_import=False,      # Enable $import/$importdefs
    import_map=None,         # Dict mapping URIs to local files
    extended=False,          # Enable extended validation features
    external_schemas=None    # List of schema dicts to sideload (matched by $id)
)

errors = validator.validate_instance(instance)

Sideloading External Schemas

When using $import to reference external schemas, you can provide those schemas directly instead of fetching them from URIs:

from json_structure import InstanceValidator

# External schema that would normally be fetched from https://example.com/address.json
address_schema = {
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://example.com/address.json",
    "name": "Address",
    "type": "object",
    "properties": {
        "street": {"type": "string"},
        "city": {"type": "string"}
    }
}

# Main schema that imports the address schema
main_schema = {
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://example.com/person",
    "name": "Person",
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "address": {"type": {"$ref": "#/definitions/Imported/Address"}}
    },
    "definitions": {
        "Imported": {
            "$import": "https://example.com/address.json"
        }
    }
}

# Sideload the address schema - matched by $id
validator = InstanceValidator(
    main_schema,
    allow_import=True,
    external_schemas=[address_schema]
)

instance = {
    "name": "Alice",
    "address": {"street": "123 Main St", "city": "Seattle"}
}

errors = validator.validate_instance(instance)

You can supply multiple schemas to satisfy multiple imports. The schemas are matched by their $id field against the import URIs.

Development

# Clone the repository
git clone https://github.com/json-structure/sdk.git
cd sdk/python

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=json_structure --cov-report=term-missing

License

MIT License - see LICENSE for details.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

json_structure-0.5.5.tar.gz (42.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

json_structure-0.5.5-py3-none-any.whl (45.9 kB view details)

Uploaded Python 3

File details

Details for the file json_structure-0.5.5.tar.gz.

File metadata

  • Download URL: json_structure-0.5.5.tar.gz
  • Upload date:
  • Size: 42.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for json_structure-0.5.5.tar.gz
Algorithm Hash digest
SHA256 d85f0549921e453bd0273f60499ac1054b40c03c0de3fb9928c5c30aed26fd10
MD5 0b0f3f73c31d2e5ec7dd7a3d7e35484e
BLAKE2b-256 995ccd43826c3974d8522a090216411b0fb7abde532017c37ee2f94a5508d17a

See more details on using hashes here.

Provenance

The following attestation bundles were made for json_structure-0.5.5.tar.gz:

Publisher: python.yml on json-structure/sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file json_structure-0.5.5-py3-none-any.whl.

File metadata

  • Download URL: json_structure-0.5.5-py3-none-any.whl
  • Upload date:
  • Size: 45.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for json_structure-0.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 96b436358652f3450e51275d051b285068921ecac9bd52e9b7b04f96ed954915
MD5 f8ecb1e2473ff4b20306c0936e4473f4
BLAKE2b-256 90ac2984d7f75aaf73a2ebfe8873344984876a6075b89715963d91146fe20d2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for json_structure-0.5.5-py3-none-any.whl:

Publisher: python.yml on json-structure/sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page