Docs / Strand / templating/jsonpath
JSONPath Integration
JSONPath is integrated into Strand as a Jinja2 filter and function, providing powerful JSON querying capabilities.
Why JSONPath?
JSONPath excels at querying complex, nested JSON structures. Use it when direct field access becomes cumbersome or when you need to filter arrays.
Using as a Filter#
jinja
{{ payload | jsonpath('$.field.subfield') }}
{{ steps.api_call.output_payload | jsonpath('$.items[*].id') }}
Using as a Function#
jinja
{{ jsonpath('$.users[?(@.active == true)].email', payload) }}
{{ jsonpath('$.results[*].id', steps.process.output_payload) }}
Filter vs Function
Both approaches work the same way. Use whichever feels more natural:
- Filter:
{{ data | jsonpath('$.path') }} - Function:
{{ jsonpath('$.path', data) }}
Basic Queries#
Extract Single Field#
jinja
{{ payload | jsonpath('$.user.name') }}
Extract All Matching#
jinja
{{ payload | jsonpath('$.items[*].id') }}
Nested Access#
jinja
{{ event | jsonpath('$.data.results[0].value') }}
Example: Complex Nested Access
jinja
{{ payload | jsonpath('$.users[0].addresses[?(@.primary == true)].street') }}
Built-in Functions#
Length#
jinja
{{ payload | jsonpath('$.items.`len`') }}
Counting Items
Use len to count array items or object keys:
jinja
{{ payload | jsonpath('$.users.`len`') }}
Keys#
jinja
{{ payload | jsonpath('$.object.`keys`') }}
String Operations#
| Function | Description | Example |
|---|---|---|
str() |
Convert to string | $.field.\str()\`` |
sub(/pattern/, replacement) |
Replace pattern | $.field.\sub(/old/, new)\`` |
split(",", 0, -1) |
Split string | $.field.\split(",", 0, -1)\`` |
Backticks Required
Built-in functions must be wrapped in backticks: ` len , keys `
Filtering Arrays#
Simple Filter#
jinja
{{ payload | jsonpath('$.items[?(@.count > 5)]') }}
Multiple Conditions#
jinja
{{ payload | jsonpath('$.users[?(@.active == true & @.role == "admin")]') }}
Example: Complex Filtering
jinja
{{ payload | jsonpath('$.users[?(@.age > 18 & @.verified == true & @.country == "US")]') }}
Regex Matching#
jinja
{{ payload | jsonpath('$.users[?(@.email =~ ".*@example.com")]') }}
Regex Patterns
Use =~ for regex matching. Patterns follow standard regex syntax.
Arithmetic Operations#
jinja
{{ payload | jsonpath('$.price * 1.1') }}
{{ payload | jsonpath('$.foo + $.bar') }}
{{ payload | jsonpath('$.total - $.discount') }}
Example: Calculations
jinja
{{ payload | jsonpath('$.subtotal * (1 + $.tax_rate)') }}
Combining with Jinja2#
jinja
{% set user_ids = payload | jsonpath('$.users[*].id') %}
{% for id in user_ids %}
https://api.example.com/users/{{ id }}
{% endfor %}
Powerful Combination
Combine JSONPath extraction with Jinja2 loops and conditionals for maximum flexibility!
When to Use JSONPath#
Use JSONPath When:#
- Querying nested or complex structures
- Filtering arrays based on conditions
- Extracting multiple matching values
- Using built-in functions
- Working with dynamic/depth-unknown structures
Use Direct Access When:#
- Simple field access:
{{ payload.field }} - Known structure:
{{ steps.node.output_payload.user_id }} - Simple conditionals:
{{ payload.temperature > 25 }}
Performance
Direct access is slightly faster, but JSONPath is more flexible. Use the right tool for the job!
Tendrl