RFC 9535 - JSONPath: Query Expressions for JSON in Python
Project description
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-rfc9535
Or Pipenv:
pipenv install -u jsonpath-rfc9535
Example
import jsonpath_rfc9535 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_rfc9535 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_rfc9535 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/jg-rp/python-jsonpath-rfc9535/blob/main/CHANGELOG.md
- PyPi: https://pypi.org/project/jsonpath-rfc9535
- Source code: https://github.com/jg-rp/python-jsonpath-rfc9535
- Issue tracker: https://github.com/jg-rp/python-jsonpath-rfc9535/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 query. The returned list will be empty if there were no matches.
Each JSONPathNode has properties:
value- The JSON-like value associated with the node.location- A tuple of property names and array/list indexes that were required to reach the node's value in the target JSON document.parent(New in version 0.2.0) - The node's parent node, orNoneif the current node is the root.
import jsonpath_rfc9535 as jsonpath
data = {
"users": [
{"name": "Sue", "score": 100},
{"name": "John", "score": 86, "admin": True},
{"name": "Sally", "score": 84, "admin": False},
{"name": "Jane", "score": 55},
],
"moderator": "John",
}
nodes = jsonpath.find("$.users[?@.score > 85]", data)
for node in nodes:
print(f"{node.value} at '{node.path()}'")
# {'name': 'Sue', 'score': 100} at '$['users'][0]'
# {'name': 'John', 'score': 86, 'admin': True} at '$['users'][1]'
JSONPathNode.path() returns the normalized path to the node in the target JSON document.
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.
New in version 0.2.0
Assigning to JSONPathNode.value will update the node's value and mutate source data. Beware,updating data after evaluating a query can invalidate existing child node paths.
# ... continued from above
node = jsonpath.find_one("$.users[@.name == 'John'].score")
if node:
node.value = 999
print(data["users"][1]) # {'name': 'John', 'score': 999, 'admin': True}
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_rfc9535 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-rfc9535 is distributed under the terms of the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jsonpath_rfc9535-1.0.0.tar.gz.
File metadata
- Download URL: jsonpath_rfc9535-1.0.0.tar.gz
- Upload date:
- Size: 27.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5312cbccb921d39af69ef3fef299a075c872259fa897f2126999a1c3bcb73d04
|
|
| MD5 |
f86243026e78cb932eae9ce03b400cf2
|
|
| BLAKE2b-256 |
ad6242b1ee140903ced74b213590235915e41c5e6f8de029fd43b54aad081b1b
|
File details
Details for the file jsonpath_rfc9535-1.0.0-py3-none-any.whl.
File metadata
- Download URL: jsonpath_rfc9535-1.0.0-py3-none-any.whl
- Upload date:
- Size: 36.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
713efa817d9c94e6b1372d52f00f5c9959bef2ab0fdf334de262dcf74166a2b1
|
|
| MD5 |
8e18f6c25b9c6f2fee117c00431555d6
|
|
| BLAKE2b-256 |
a98c1d201eeabbc1922c74fa0ad2cdef561c393198d0610ab28ad606929d863f
|