JSONPath
The mapping engine is jsonpath-plus running in an embedded JavaScript runtime. This page lists what that build actually supports. Every result below was produced by running the expression through the engine the flow uses. Unless a section says otherwise, the examples run against this data:Selectors
Bracket notation
Needed whenever a key is not a plain identifier — spaces, dots, hyphens, or a numeric key.Slices
Recursive descent
.. searches every level below the point it appears.
Parent and property operators
Filters
A filter is[?( … )]. The body is a JavaScript expression evaluated once per candidate, with @ bound to the candidate.
Ordinary JavaScript methods on the candidate’s own values work:
A filter may contain another filter, as long as the inner one is the whole test:
$.users[?(@.orders[?(@.total>1000)].length>5)] fails to parse with Unexpected "?" at character 12, and combining it with && returns no matches rather than an error. Count in an Eval step instead.
Context variables
What does not work
Each of these fails the step outright. The error text below is what the engine returns.| anywhere in the path
| is the concatenation delimiter and is consumed before the string ever reaches JSONPath, so a path containing one is split into fragments and each fragment is parsed separately.
| cannot appear in a mapped string at all.
Unquoted string literals
A bare word in a comparison is parsed as a variable name.[?(@.role==='admin')].
A single =
=== or ==.
Type selectors
@string(), @number(), @integer(), @boolean(), @array(), @object(), @null(), @scalar() and @undefined() all fail to parse in this build.
typeof @.v === 'number' and typeof @ === 'string' are the working substitutes. For array and object tests, use an Eval step — Array.isArray is not in scope inside a filter.
Aggregation functions
@min(), @max(), @avg(), @sum() and .max() do not exist.
[*] inside a filter body
@.expertise.indexOf('api')>-1.
A bare @ on its own
@ must be followed by a property, or wrapped in typeof.
Host globals
String, Number, Array, Object and friends are not in scope inside a filter body.
Errors you will see
There is no separate validation pass. An unresolvable mapping fails the step withfailed to resolve jPath and the message from the engine. The messages come from JSONPath and its expression parser, so they read like JavaScript errors:
A path that simply matches nothing is not an error — see the two failure modes.
Next steps
Concatenation
Building strings with
|Examples
Worked mappings, run end to end
Eval Step
Where logic JSONPath cannot express belongs
Overview
Data sources, path shapes, failure modes