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,-nOto 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.61
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| json_model_compiler-2.0.61.tar.gz | 275.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| json_model_compiler-2.0.61-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 521.4 kB
Release files / json_model_compiler-2.0.61.tar.gz
| Download URL | json_model_compiler-2.0.61.tar.gz |
|---|---|
| Size | 275.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
99bffab32c8230045c173291cf2e65ce527e5ce9d88ce3a94b2c459e320f6f1c
|
|
BLAKE2b-256 checksum How to use checksums |
2d7c9adf510205e9b85965088a2448818a8e41153480fdba2ef8aefeada57301
|
| 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.61-py3-none-any.whl
| Download URL | json_model_compiler-2.0.61-py3-none-any.whl |
|---|---|
| Size | 246.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e66547f494cff97d73e7640b0a7fb322e8d637e00a217231d71ac01f2f44dfe5
|
|
BLAKE2b-256 checksum How to use checksums |
801c378504cd937a313db5bd64a0fc0725a63086b650f947e236b319f35f79ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|