Skip to main content

jsonpath-mojo

A fast JSONPath query engine, API-compatible with the jsonpath-ng package (the jsonpath_ng.ext extended dialect), powered by a clean-room Mojo kernel — with a vendored pure-Python engine for platforms without a native build (including Windows — tested there in CI: windows-fallback).

from jsonpath_mojo import find

data = {"store": {"book": [{"title": "Sayings", "price": 8.95},
                           {"title": "Sword", "price": 12.99}]}}

find("$.store.book[*].title", data)        # [('Sayings', 'store.book.[0].title'),
                                           #  ('Sword',  'store.book.[1].title')]
find("$.store.book[?(@.price < 10)]", data)  # filter scripts
find("$..price", data)                     # recursive descent

find(expr, data) returns the same (value, str(full_path)) sequence as [(m.value, str(m.full_path)) for m in jsonpath_ng.ext.parse(expr).find(data)] — same values, same order, same path rendering, verified element-for-element by the differential test suite on both backends.

  • Same results: the suite runs every query against the published jsonpath_ng==1.7.0 oracle and asserts exact sequence parity — plus exception-type parity for the error contract (parse errors raise jsonpath_mojo.JsonPathError; runtime errors raise the same builtin TypeError/KeyError/IndexError/ValueError/NotImplementedError the oracle raises).
  • Much faster: a native expression parser + evaluator instead of a PLY parser rebuilt per call — 49x faster at 100-book documents, 3.6x at 2k, 1.7x at 20k (Apple M4 Max; full method and numbers below).
  • No toolchain needed: per-platform wheels ship the compiled kernel. Everywhere else the package transparently uses its pure-Python engine (which is itself ~2-28x faster than the oracle on these datasets).
  • Force the fallback with JSONPATH_MOJO_DISABLE_NATIVE=1; inspect the active backend with jsonpath_mojo.backend_info().

Supported syntax

  • child steps: $.a, $['a'], $.a.b, dot-number children $.a.0
  • field unions: $['a', 'b'] (expression order, duplicates repeated); a quoted '*' — alone or in a union — is a wildcard
  • wildcards: $.* (object values), $[*] (sequence elements; see README in the repo for the exact non-list truth table)
  • recursive descent: $..a, $..*, $..[0], $..['a'] (DFS pre-order)
  • index: $.a[0], $.a[-1]
  • slices: $.a[1:5:2], $.a[::-1] (Python slice semantics)
  • filters: $.a[?(@.x > 2)] with == != < <= > >=, & conjunctions, existence tests ?(@.x), arith (+ - *) on the left side, literals (numbers, quoted strings, true/false, bare words) on the right, and @ paths with fields/indexes/slices/wildcards

Expressions outside this grammar (or data outside the JSON domain — non-string dict keys, NaN/Infinity, tuples, custom objects) are handled with identical results: grammar gaps raise JsonPathError, non-JSON data transparently reroutes to the pure-Python engine. Currently unsupported oracle features: ?(...) filters nested inside a filter path (e.g. ?(@.a[?(@ > 1)] == 2)), and sorting/~ regex extensions.

Benchmarks

Method (see benchmarks/bench_jsonpath.py in the repository): store-shaped JSON documents (100 / 2,000 / 20,000 book records) and a 14-query battery covering the supported scope. Each cell runs jsonpath_ng.ext.parse(expr). find(data) per query against jsonpath_mojo.find(expr, data). COLD = first battery call (includes one-time parser setup); WARM = median of 5 battery runs. Correctness is asserted before timing.

Measured on Apple M4 Max, macOS 26.6.2, Python 3.12.14, jsonpath_ng 1.7.0, Mojo 1.1.0, 2026-09-19:

dataset backend cold (s) warm (s) speedup (warm)
100 books oracle jsonpath_ng 0.1568 0.1993 1.0x
jsonpath-mojo native 0.0050 0.0041 49.2x
jsonpath-mojo fallback 0.0078 0.0071 27.9x
2,000 books oracle jsonpath_ng 0.3209 0.2750 1.0x
jsonpath-mojo native 0.0728 0.0766 3.6x
jsonpath-mojo fallback 0.1411 0.1353 2.0x
20,000 books oracle jsonpath_ng 1.7522 1.4909 1.0x
jsonpath-mojo native 0.7877 0.8738 1.7x
jsonpath-mojo fallback 1.4734 1.2992 1.1x

The oracle rebuilds its PLY parser on every parse() call (~7 ms), so small and medium documents are dominated by expression parsing — where the native kernel and even the pure-Python engine win overwhelmingly. On very large documents the evaluation itself dominates; the native pipeline (json.dumps → kernel parse+eval → path resolution) still leads, and result correctness is identical either way.

Source, tests, and development: https://github.com/thyn-ai/mojo-kernels

License: Apache-2.0, © 2026 Algenta

Metadata

Release files for jsonpath-mojo 0.2.3

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

Built distributions (wheels)

Table of built distributions (wheels) for jsonpath-mojo 0.2.3
File Interpreter ABI Platform
jsonpath_mojo-0.2.3-py3-none-manylinux_2_35_x86_64.whl Python 3 none Linux glibc 2.35+ x86-64 Details
jsonpath_mojo-0.2.3-py3-none-macosx_14_0_arm64.whl Python 3 none macOS 14.0+ ARM64 Details

Total release size: 2.0 MB

Release files / jsonpath_mojo-0.2.3-py3-none-manylinux_2_35_x86_64.whl

Download URL jsonpath_mojo-0.2.3-py3-none-manylinux_2_35_x86_64.whl
Size 870.9 kB
Tags Linux glibc 2.35+ x86-64 Python 3
SHA-256 checksum
How to use checksums
22246b4458a78b5e3943b4e7c15ff95f6f7774d5eb54a08b0ae4b4b5b74024c7
BLAKE2b-256 checksum
How to use checksums
1ab7249b04280650fdb144536af297d420aec78a438da1df02fb98ca6feda4a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / jsonpath_mojo-0.2.3-py3-none-macosx_14_0_arm64.whl

Download URL jsonpath_mojo-0.2.3-py3-none-macosx_14_0_arm64.whl
Size 1.1 MB
Tags Python 3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
09c774bedc49d788a699048d29561d1791e3c4d1086acb0bd4f7d189cb13017e
BLAKE2b-256 checksum
How to use checksums
35d884958a0af29953ab8ee83b225899acdec5d968baf28787808041b48886d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.2.4

2 release files

This release

0.2.3 This release

2 release files

0.1.5

2 release files

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