Skip to main content

jsonata-python

Build Status PyPI

Pure Python implementation of JSONata.

This is a Python port of the JSONata reference implementation, and also borrows from the Dashjoin Java port.

This implementation supports 100% of the language features of JSONata, with no external dependencies. The JSONata documentation can be found here.

Installation

pipx install jsonata-python

Getting Started

A very simple start:

>>> import jsonata
>>> data = {"example": [{"value": 4}, {"value": 7}, {"value": 13}]}
>>> expr = jsonata.Jsonata("$sum(example.value)")
>>> result = expr.evaluate(data)
>>> result
24

Command Line Interface

The CLI provides the same functionality as the Dashjoin JSONata CLI.

% jsonata -h
usage: jsonata [-h] [-v] [-e <file>] [-i <arg>] [-ic <arg>] [-f {auto,json,string}] [-o <arg>] [-oc <arg>] [-time] [-c] [-b <json-string>]
                   [-bf <file>] [-it]
                   [expr]

Pure Python JSONata CLI

positional arguments:
  expr

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -e <file>, --expression <file>
                        JSON expression to evaluate.
  -i <arg>, --input <arg>
                        JSON input file (- for stdin)
  -ic <arg>, --icharset <arg>
                        Input character set (default=utf-8)
  -f {auto,json,string}, --format {auto,json,string}
                        Input format (default=auto)
  -o <arg>, --output <arg>
                        JSON output file (default=stdout)
  -oc <arg>, --ocharset <arg>
                        Output character set (default=utf-8)
  -time                 Print performance timers to stderr
  -c, --compact         Compact JSON output (don't prettify)
  -b <json-string>, --bindings <json-string>
                        JSONata variable bindings
  -bf <file>, --bindings-file <file>
                        JSONata variable bindings file
  -it, --interactive    Interactive REPL (requires input file)

Examples

% echo '{"a":"hello", "b":" world"}' | jsonata '(a & b)'
hello world

% echo '{"a":"hello", "b":" world"}' | jsonata -o helloworld.json $
# helloworld.json written

% ls | jsonata $
helloworld.json

% ps -o pid="",%cpu="",%mem="" | jsonata '$.$split(/\n/).$trim().[ $split(/\s+/)[$length()>0].$number() ]' -c
[[4105,0,0],[4646,0,0],[4666,0,0],[33696,0,0]...]

% curl -s https://raw.githubusercontent.com/jsonata-js/jsonata/master/test/test-suite/datasets/dataset1.json | jsonata '{"Name": FirstName & " " & Surname, "Cities": **.City, "Emails": Email[type="home"].address}'
{
  "Name": "Fred Smith",
  "Cities": [
    "Winchester",
    "London"
  ],
  "Emails": [
    "freddy@my-social.com",
    "frederic.smith@very-serious.com"
  ]
}

% jsonata -i helloworld.json -it
Enter an expression to have it evaluated.
JSONata> (a & b)
hello world

Guardrails

JSONata is Turing-complete, so it's possible to write expressions that loop forever or exhaust memory. If you evaluate untrusted expressions, configure these guardrails (see the JS reference implementation's guardrails docs for more background):

  • Stack overflow — the stack parameter caps the depth of the eval-apply cycle. Exceeding it raises D1011.
  • Excessive execution time — the timeout parameter (in milliseconds) catches tail-recursive infinite loops that stack can't. Exceeding it raises D1012.
  • Rogue regular expressions — the regex_engine parameter lets you swap in a linear-time engine (e.g. google-re2) to protect against ReDoS, since the timeout guardrail can't interrupt a regex match in progress.
import re2  # pip install google-re2
import jsonata
from jsonata.regex_engine import RegexFlags


def re2_regex_engine(pattern: str, flags: RegexFlags):
    options = re2.Options()
    options.case_sensitive = not flags.case_insensitive
    options.one_line = not flags.multiline
    return re2.compile(pattern, options)


expr = jsonata.Jsonata("<JSONata expression>", re2_regex_engine, timeout=1000, stack=500)
result = expr.evaluate(data)

Running Tests

This project uses the repository of the reference implementation as a submodule. This allows referencing the current version of the unit tests. To clone this repository, run:

git clone --recurse-submodules https://github.com/rayokota/jsonata-python

To build and run the unit tests:

python3 -m pip install nox
nox --sessions tests

Notes

JSONata date/time functions that use ISO 8601 formats are only supported with Python 3.11+.

Download files

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

Source Distribution

jsonata_python-0.7.0.tar.gz (368.7 kB view details)

Uploaded Source

Built Distribution

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

jsonata_python-0.7.0-py3-none-any.whl (87.4 kB view details)

Uploaded Python 3

File details

Details for the file jsonata_python-0.7.0.tar.gz.

File metadata

  • Download URL: jsonata_python-0.7.0.tar.gz
  • Upload date:
  • Size: 368.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for jsonata_python-0.7.0.tar.gz
Algorithm Hash digest
SHA256 2cf788147a0d444cb9d7d81c58da9991607280d6a5d0f06bd2dd212a59fdcb16
MD5 403da781c5c9368b5ff129d02d993e4b
BLAKE2b-256 9d6ab756e10939f584b0629c301bb4aa0e79f94163ac3b0083c788b8ee78c708

See more details on using hashes here.

File details

Details for the file jsonata_python-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: jsonata_python-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 87.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for jsonata_python-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 85b8dd2adf9c17a67494892ef04bc191ba2156598daae4465eec30ffd1559238
MD5 7701f308ccdf2d64e8cff85daaa06314
BLAKE2b-256 033017eaf4576916556875fc961002cb67d0b404abc3345ab2bb13f1496654a2

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 Sentry Error logging StatusPage Status page