RFC 9535 JSONPath: Query Expressions for JSON in Python
We follow RFC 9535 strictly and test against the JSONPath Compliance Test Suite.
Table of Contents
Install
Install Python JSONPath RFC 9535 using pip:
pip install jsonpath-ext
Or Pipenv:
pipenv install -u jsonpath-ext
Example
import jsonpath_ext as jsonpath
data = {
"users": [
{"name": "Sue", "score": 100},
{"name": "Sally", "score": 84, "admin": False},
{"name": "John", "score": 86, "admin": True},
{"name": "Jane", "score": 55},
],
"moderator": "John",
}
for node in jsonpath.find("$.users[?@.score > 85]", data):
print(node.value)
# {'name': 'Sue', 'score': 100}
# {'name': 'John', 'score': 86, 'admin': True}
Or, reading JSON data from a file:
import json
import jsonpath_ext as jsonpath
with open("/path/to/some.json", encoding="utf-8") as fd:
data = json.load(fd)
nodes = jsonpath.find("$.some.query", data)
values = nodes.values()
# ...
You could read data from a YAML formatted file too. If you have PyYaml installed:
import jsonpath_ext as jsonpath
import yaml
with open("some.yaml") as fd:
data = yaml.safe_load(fd)
products = jsonpath.find("$..products.*", data).values()
# ...
Links
- Change log: https://github.com/riccardo92/python-jsonpath-ext/blob/main/CHANGELOG.md
- PyPi: https://pypi.org/project/jsonpath-ext
- Source code: https://github.com/riccardo92/python-jsonpath-ext
- Issue tracker: https://github.com/riccardo92/python-jsonpath-ext/issues
Related projects
- Python JSONPath - Another Python package implementing JSONPath, but with additional features and customization options.
- JSON P3 - RFC 9535 implemented in TypeScript.
API
find
find(query: str, value: JSONValue) -> JSONPathNodeList
Apply JSONPath expression query to value. value should arbitrary, possible nested, Python dictionaries, lists, strings, integers, floats, Booleans or None, as you would get from json.load().
A list of JSONPathNode instances is returned, one node for each value matched by path. The returned list will be empty if there were no matches.
Each JSONPathNode has:
- a
valueproperty, which is the JSON-like value associated with the node. - a
locationproperty, which is a tuple of property names and array/list indexes that were required to reach the node's value in the target JSON document. - a
path()method, which returns the normalized path to the node in the target JSON document.
import jsonpath_ext as jsonpath
value = {
"users": [
{"name": "Sue", "score": 100},
{"name": "John", "score": 86, "admin": True},
{"name": "Sally", "score": 84, "admin": False},
{"name": "Jane", "score": 55},
],
"moderator": "John",
}
for node in jsonpath.find("$.users[?@.score > 85]", value):
print(f"{node.value} at '{node.path()}'")
# {'name': 'Sue', 'score': 100} at '$['users'][0]'
# {'name': 'John', 'score': 86, 'admin': True} at '$['users'][1]'
JSONPathNodeList is a subclass of list with some helper methods.
values()returns a list of values, one for each node.items()returns a list of(normalized path, value)tuples.
find_one
find_one(query: str, value: JSONValue) -> Optional[JSONPathNode]
find_one() accepts the same arguments as find(), but returns the first available JSONPathNode, or None if there were no matches.
find_one() is equivalent to:
def find_one(query, value):
try:
return next(iter(jsonpath.finditer(query, value)))
except StopIteration:
return None
finditer
finditer(query: str, value: JSONValue) -> Iterable[JSONPathNode]
finditer() accepts the same arguments as find(), but returns an iterator over JSONPathNode instances rather than a list. This could be useful if you're expecting a large number of results that you don't want to load into memory all at once.
compile
compile(query: str) -> JSONPathQuery
find(query, value) is a convenience function for JSONPathEnvironment().compile(query).apply(value). Use compile(query) to obtain a JSONPathQuery instance which can be applied to difference JSON-like values repeatedly.
import jsonpath_ext as jsonpath
value = {
"users": [
{"name": "Sue", "score": 100},
{"name": "John", "score": 86, "admin": True},
{"name": "Sally", "score": 84, "admin": False},
{"name": "Jane", "score": 55},
],
"moderator": "John",
}
query = jsonpath.compile("$.users[?@.score > 85]")
for node in query.apply(value):
print(f"{node.value} at '{node.path()}'")
# {'name': 'Sue', 'score': 100} at '$['users'][0]'
# {'name': 'John', 'score': 86, 'admin': True} at '$['users'][1]'
A JSONPathQuery has a finditer(value) method too, and find(value) is an alias for apply(value).
License
python-jsonpath-ext is distributed under the terms of the MIT license.
Metadata
Release files for jsonpath-ext 0.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jsonpath_ext-0.0.5.tar.gz | 43.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jsonpath_ext-0.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 77.4 kB
Release files / jsonpath_ext-0.0.5.tar.gz
| Download URL | jsonpath_ext-0.0.5.tar.gz |
|---|---|
| Size | 43.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c948ac2d1d85b15c621f54a9623fc8e7053401a2741381fc799c00df37fb944
|
|
BLAKE2b-256 checksum How to use checksums |
fb3cfb7783d5b2ec8a366252b1115f6d84209493b0355dba322f11317ee498d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.1.0 CPython/3.12.4
|
Release files / jsonpath_ext-0.0.5-py3-none-any.whl
| Download URL | jsonpath_ext-0.0.5-py3-none-any.whl |
|---|---|
| Size | 33.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bd4bb164ada4ecf136d01ae4d38405a95661c17ad63048c9f4b0957367cf47a2
|
|
BLAKE2b-256 checksum How to use checksums |
404460e2327cf5ad54fa789beac5067f10852951bdc908423143400eaa3cbed3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.1.0 CPython/3.12.4
|