ObjectPath (Python)
ObjectPath is a Python library that provides an agile query language for semi-structured data, particularly JSON. It allows for powerful querying similar to XPath or JSONPath, incorporating arithmetic calculations, comparisons, and built-in functions. The current version is 0.6.1, released in November 2018. The original Python implementation (adriank/ObjectPath) is currently not actively maintained, which is an important consideration for new projects.
Common errors
-
NameError: name 'Tree' is not defined
cause The Tree class was used without being imported from the objectpath library.fixAdd `from objectpath import Tree` at the beginning of your script. -
TypeError: 'generator' object is not subscriptable
cause Attempting to access elements by index (e.g., `results[0]`) directly on the generator returned by `tree.execute()`.fixConvert the generator to a list or tuple first: `results = list(tree.execute('$.path'))`. -
SyntaxError: invalid syntax (in query string)
cause The ObjectPath query string contains a syntax error, which could be due to incorrect operators, malformed expressions, or improper use of built-in functions.fixDouble-check the query against the ObjectPath reference documentation for correct syntax. Pay attention to quotation marks for string literals, array filtering conditions, and operator precedence.
Warnings
- breaking The primary Python `objectpath` library (version 0.6.1) is not actively maintained. The author has stated that they 'don't code in Python anymore' and cannot accept pull requests. Consider `objectpath-ng` for a potentially more actively maintained alternative if long-term support is critical.
- gotcha When executing queries, `tree.execute()` returns a generator. If you need a list of all results, you must explicitly convert it (e.g., `list(tree.execute(...))`). Forgetting this can lead to unexpected behavior if you expect an iterable that can be traversed multiple times or directly indexed.
- gotcha ObjectPath uses a custom query syntax that, while powerful, can be unfamiliar to users accustomed to other query languages like XPath or JSONPath, leading to syntax errors or incorrect results. Pay close attention to the documentation for operators and functions.
Install
-
pip install objectpath
Imports
- Tree
from objectpath import Tree
- * (all)
from objectpath import *
Quickstart
import json
from objectpath import Tree
data = {
"store": {
"book": [
{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95},
{"category": "fiction", "author": "E.B. White", "title": "Charlotte's Web", "price": 7.99},
{"category": "fiction", "author": "J.R.R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99}
],
"bicycle": {"color": "red", "price": 19.95}
}
}
tree = Tree(data)
# Find all authors
authors = tree.execute("$.store.book[*].author")
print(f"Authors: {list(authors)}")
# Find books cheaper than 10
cheap_books = tree.execute("$.store.book[(@.price < 10)].title")
print(f"Cheap books: {list(cheap_books)}")
# Find the red bicycle's price
bicycle_price = tree.execute("$.store.bicycle.price")
print(f"Bicycle price: {bicycle_price}")