Skip to main content

JSON Model

JSON Model is a compact and intuitive JSON syntax to describe JSON data structures.

This reference implementation allows to generate code in Python, C, JavaScript, PL/pgSQL, Perl and Java for checking a JSON value against a JSON model, and to export models to JSON Schema or Pydantic.

It is dedicated to the Public Domain.

JMC Command

JSON Model optimizing compiler (jmc) can be installed as a Python package or a Container image docker.io/zx80/jmc, see Installation HOWTO.

Command jmc options include:

  • main operations (default depends on other options, final guess is preprocess):
    • -P: preprocess model.
    • -C: compile to Python, C, JS, PL/pgSQL, Perl, Java.
    • -E: export to JSON Schema version draft 2020-12 or Pydantic.
  • -O: optimize model: constant propagation, partial evaluation, xor to or conversion, flattening… (this is the default, -nO to disable)
  • -o output: file output instead of standard
  • …

For instance, let's consider a JSON model in file person.model.json:

{
  "#": "A person with a birth date",
  "name": "/^[a-z]+$/i",
  "born": "$DATE"
}
  • to check directly sample JSON values against it (with the Python backend):

    jmc -r person.model.json hobbes.json oops.json
    
    hobbes.json: PASS
    oops.json: FAIL (.: not an expected object [.]; .: missing mandatory prop <born> [.])
    
  • to compile an executable for checking a model (with the C backend), and use it for validating values:

    jmc -o ./person.out person.model.json
    ./person.out -r hobbes.json oops.json
    
    hobbes.json: PASS
    oops.json: FAIL (.: not an expected object [.]; .: missing mandatory prop <born> [.])
    

    The generated executable allow to collect validation performance figures (average and standard deviation) over a loop, with or without reporting:

    ./person.out -r -T 100000 hobbes.json
    
    hobbes.json.[0] nop PASS 0.056 ± 0.423 µs/check (0.174)
    hobbes.json.[0] rep PASS 0.071 ± 0.443 µs/check (0.174)
    hobbes.json: PASS
    
  • to export this model as a JSON schema in the YaML format:

    jmc -E -F yaml person.model.json
    
    description: A person with a birth date
    type: object
    properties:
      name:
        type: string
        pattern: (?i)^[a-z]+$
      born:
        type: string
        format: date
    required:
    - name
    - born
    additionalProperties: false
    

JSON Model Python API

The package provides functions to create and check models from Python:

import json_model as jm

# direct model definition with 2 mandatory properties
person_model: jm.Jsonable = {
  "name": "/^[a-z]+$/i",
  "born": "$DATE"
}

# create a dynamically compiled checker function for the model
checker = jm.model_checker_from_json(person_model)

# check valid data
good_person = { "name": "Hobbes", "born": "2020-07-29" }
print(good_person, "->", checker(good_person))

# check invalid data
bad_person = { "name": "Oops" }
print(bad_person, "->", checker(bad_person))

# collect reasons
reasons: jm.Report = []
assert not checker(bad_person, "", reasons)
print("reasons:", reasons)

JSON Model Validation Performance

See the benchmark page for artifacts which compare various JSON Model Compiler runs (C, JS, Java, Python) with Sourcemeta Blaze CLI as a baseline using test cases from JSON Schema Benchmark. Overall, JMC-C implementation is about twice faster than Blaze C++. Moreover, JMC-Java/GSON native implementations are only about 50% slower than Blaze C++, and JMC-JS 200% slower, which given the intrinsic language capabilities is quite honorable.

More Information

See the JSON Model website, which among many resources, includes a tutorial for a hands-on overview of JSON Model, and links to research papers for explanations about the design.

JSON Model Distribution

Metadata

Release files for json-model-compiler 2.0.59

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for json-model-compiler 2.0.59
File Size Uploaded
json_model_compiler-2.0.59.tar.gz 272.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for json-model-compiler 2.0.59
File Interpreter ABI Platform
json_model_compiler-2.0.59-py3-none-any.whl Python 3 none any Details

Total release size: 516.3 kB

Release files / json_model_compiler-2.0.59.tar.gz

Download URL json_model_compiler-2.0.59.tar.gz
Size 272.3 kB
Tags Source
SHA-256 checksum
How to use checksums
2dd05e5b4acf97ca95b0c4ef819e8b3faa286645595609ba23bbc5cb8d1bfb78
BLAKE2b-256 checksum
How to use checksums
162049eaaa3adb003d1279275a6e2391a6eb501c5b7763746feda4c86a2e7dcc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / json_model_compiler-2.0.59-py3-none-any.whl

Download URL json_model_compiler-2.0.59-py3-none-any.whl
Size 243.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2371acba51f274910b8e682e9d9730a533112daffa2ab1ff7e2b76f44550ec60
BLAKE2b-256 checksum
How to use checksums
4f29e24dc4c466b6270e2a3f4ed7373cb677508b2a1d59cfd58eb94688da7b3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page