Skip to main content

transon

PyPI PyPI - Python Version Codecov PyPI - Downloads

Homogeneous JSON template engine — the template is itself plain JSON.

What is transon?

transon reshapes one JSON document into another using a template that is itself plain JSON. Instead of writing imperative glue code to walk and rebuild data, you describe the shape of the output once and let the engine fill it in from the input — there is no separate template language and no string-embedded DSL to learn.

                    ┌─────────────────┐
                    │  JSON Template  │
                    └────────┬────────┘
                             │
┌──────────────┐    ┌────────▼────────┐    ┌───────────────┐
│  JSON Input  ├────►     transon     ├────►  JSON Output  │
└──────────────┘    └─────────────────┘    └───────────────┘

It is inspired by XSLT (declarative, tree-to-tree transformation) and JsonLogic (logic expressed as data), applying those ideas to JSON-to-JSON transformation.

Documentation and playground: https://transon-org.github.io/

What you can do

Beyond simple interpolation, transon offers:

  • Static validationTransformer(template, validate=True) (or calling .validate()) checks the template's structure up front, without any input data.
  • Defaults for missing valuesattr, get, join, format, and include accept a default template, used when the looked-up value is absent.
  • A "no value" model — missing data produces the NO_CONTENT sentinel; container rules skip it instead of emitting null, so optional data simply disappears from the output.
  • Literal keys — the object rule's fields mode builds dicts with literal keys, including a key equal to the marker ($).
  • Configurable markerTransformer(template, marker="@") if $ collides with your data.
  • Safe outputtransform(data, copy_output=True) deep-copies the result so it shares no mutable structure with the input (which is never mutated regardless).
  • A clear error modelDefinitionError for malformed templates, TransformationError for data that does not fit; messages include the template path where the problem occurred (at template → …).
  • I/O delegates — the file rule writes through a file_writer callback and the include rule loads sub-templates through a template_loader callback.
  • Offline docs & metadata exports — the installed package serves its own Language Reference (transon.reference.get_language_reference()), editor metadata, and generated docs.

Development Principles

transon was built with a set of key development principles in mind, including:

  • Flexibility and Extensibility: transon is designed to be highly flexible and extensible, allowing you to add new rules and types of placeholders to suit your unique needs.
  • Valid JSON Structure: transon templates are defined as valid JSON structures, making them easy to work with and compatible with a wide range of tools and applications.
  • Composable Rules: transon rules are highly composable, allowing you to define complex behavior patterns using a combination of nested rules. For example, arithmetic expressions can be defined with nested rules, where each rule represents a specific operation. This approach eliminates the need for a domain-specific language (DSL) for arithmetic expressions.
  • Marker-Based Templates: The most important aspect of a transon template is the use of the $ marker. This marker is a special key within the JSON structure that distinguishes it from other types of JSON data. By default, the $ key is used as the marker, but you can change it to any other value you prefer.

By using a marker-based approach, transon ensures that templates are easy to work with and can be easily distinguished from other types of JSON data. This makes it simple to generate dynamic templates, manipulate JSON data, and produce new JSON structures that meet your specific requirements. Additionally, the composable rules approach allows for advanced behavior patterns that can be defined using a combination of nested rules, making transon highly flexible and extensible.

Installation

transon can be installed using pip, the Python package manager. Simply run the following command:

pip install transon

Development

Requires Python 3.9+ and uv.

uv sync --dev
uv run pytest .

Comparison

JSON transformation is a crowded space. transon's bet is that templates are themselves pure JSON — storable, generatable, diff-able, and extensible with your own rules — traded against the terseness of a string DSL. Pick the tool that fits the job:

Tool Template / language Extensible Deps & runtime Best when
transon pure JSON tree custom rules, operators, functions none (Python stdlib) templates must be stored / generated / validated as JSON, with domain-specific rules, in Python
JSONata string expression DSL limited JS library concise queries & expressions over JSON in JavaScript
jq string filter language limited native binary CLI piping and ad-hoc filtering in the shell
JSLT string DSL (jq-like) user functions JVM compact JSON→JSON on the JVM
Jolt JSON spec limited JVM declarative structural reshaping on the JVM
JsonLogic JSON logic tree limited small libs (many languages) portable business/boolean rules shared across services
JSON-e JSON template limited JS / Python parameterising JSON config with interpolation
Jsonnet full templating language yes native binary generating large config (e.g. Kubernetes) from a real language
json-templates JSON with {{placeholders}} no tiny JS library simple value substitution into a JSON skeleton

Where transon is not the best pick (worth being honest about):

  • Expression-heavy transforms read far more concisely in a string DSL like JSONata or jq — transon spells (a + b) * c as a nested rule tree.
  • Maturity & ecosystem: jq and JSONata are battle-tested with large communities; transon is young and Python-only.

The trade-off, concretely

The same transform — multiply each order's qty by its price — over input {"orders": [{"qty": 2, "price": 3}, {"qty": 5, "price": 7}]}:

JSONata — a terse string expression:

orders.(qty * price)

transon — pure JSON, composable rules:

{
  "$": "chain",
  "funcs": [
    {"$": "attr", "name": "orders"},
    {
      "$": "map",
      "item": {
        "$": "expr",
        "op": "mul",
        "values": [
          {"$": "attr", "name": "qty"},
          {"$": "attr", "name": "price"}
        ]
      }
    }
  ]
}

Both yield [6, 35]. JSONata wins on brevity; transon wins when the template itself must be data — stored in a database, generated by another program, reviewed as a diff, checked with Transformer.validate(), or extended with your own rules.

Download files

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

Source Distribution

transon-0.2.1.tar.gz (66.1 kB view details)

Uploaded Source

Built Distribution

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

transon-0.2.1-py3-none-any.whl (72.8 kB view details)

Uploaded Python 3

File details

Details for the file transon-0.2.1.tar.gz.

File metadata

  • Download URL: transon-0.2.1.tar.gz
  • Upload date:
  • Size: 66.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for transon-0.2.1.tar.gz
Algorithm Hash digest
SHA256 197cf22d4b184cdbdae7d69a2dd5e4db22827cc73885879ae7d2b2683255d9f0
MD5 43c2522499d6395c7e4e3438cef3eab3
BLAKE2b-256 e64ee25544f738327682011d06bb3e123b4b16aee101f6c2d27c21e17f7fba3e

See more details on using hashes here.

File details

Details for the file transon-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: transon-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 72.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for transon-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dfd1b8f56626ba3a15652bcc04cfe8c2aa758d3e6aadab5b034239b93b11cb2c
MD5 df3c459ff526409f4fe3871ef42d6fdc
BLAKE2b-256 dcc97600cafe80a39525dc8b82c0d076d1da239262efce7655216035ab8b8419

See more details on using hashes here.

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