Files
n8n-docs/docs/code-examples/javascript-functions/jmespath.md
2023-07-18 15:33:16 +01:00

226 lines
5.3 KiB
Markdown

---
contentType: howto
---
# Query JSON with JMESPath
[JMESPath](https://jmespath.org/) is a query language for JSON, allowing you to extract and transform elements from a JSON document. For full details of how to use JMESPath, refer to the [JMESPath documentation](https://jmespath.org/tutorial.html).
## The `$jmespath()` method
n8n provides a custom method, `$jmespath()`. It allows you to perform a search on a JSON object using the JMESPath query language.
The basic syntax is:
```js
$jmespath(object, searchString)
```
To help understand what the method does, here is the equivalent longer JavaScript:
```js
var jmespath = require('jmespath');
jmespath.search(object, searchString);
```
`object` is a JSON object, such as the output of a previous node. `searchString` is an expression written in the JMESPath query language. The [JMESPath Specification](https://jmespath.org/specification.html#jmespath-specification){:target=_blank .external-link} provides a list of supported expressions, while their [Tutorial](https://jmespath.org/tutorial.html) and [Examples](https://jmespath.org/examples.html){:target=_blank .external-link} provide interactive examples.
!!! warning "Search parameter order"
The examples in the [JMESPath Specification](https://jmespath.org/specification.html#jmespath-specification){:target=_blank .external-link} follow the pattern `search(searchString, object)`. The [JMESPath JavaScript library](https://github.com/jmespath/jmespath.js/){:target=_blank .external-link}, which n8n uses, supports `search(object, searchString)` instead. This means that when using examples from the JMESPath documentation, you may need to change the order of the search function parameters.
## Common tasks
This section provides examples for some common operations. More examples, and detailed guidance, are available in [JMESPath's own documentation](https://jmespath.org/tutorial.html){:target=_blank .external-link}.
### Apply a JMESPath expression to a collection of elements with projections
From the [JMESPath projections documentation](https://jmespath.org/tutorial.html#projections){:target=_blank .external-link}:
> Projections are one of the key features of JMESPath. It allows you to apply an expression to a collection of elements. JMESPath supports five kinds of projections:
>
> * List Projections
> * Slice Projections
> * Object Projections
> * Flatten Projections
> * Filter Projections
The following example shows basic usage of list, slice, and object projections. Refer to the [JMESPath projections documentation](https://jmespath.org/tutorial.html#projections){:target=_blank .external-link} for detailed explanations of each projection type, and more examples.
Given this JSON from a webhook node:
```js
[
{
"headers": {
"host": "n8n.instance.address",
...
},
"params": {},
"query": {},
"body": {
"people": [
{
"first": "James",
"last": "Green"
},
{
"first": "Jacob",
"last": "Jones"
},
{
"first": "Jayden",
"last": "Smith"
}
],
"dogs": {
"Fido": {
"color": "brown",
"age": 7
},
"Spot": {
"color": "black and white",
"age": 5
}
}
}
}
]
```
Retrieve a [list](https://jmespath.org/tutorial.html#list-and-slice-projections){:target=_blank .external-link} of all the people's first names:
```js
$jmespath($json.body.people, "[*].first" )
/* Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
*/
```
Get a [slice](https://jmespath.org/tutorial.html#list-and-slice-projections){:target=_blank .external-link} of the first names:
```js
$jmespath($json.body.people, "[:2].first")
/* Returns:
[
{
"firstNames": [
"James",
"Jacob",
"Jayden"
]
}
]
*/
```
Get a list of the dogs' ages using [object projections](https://jmespath.org/tutorial.html#object-projections){:target=_blank .external-link}:
```js
$jmespath($json.body.dogs, "*.age")
/* Returns:
[
7,
5
]
*/
```
### Select multiple elements and create a new list or object
[Multiselect](https://jmespath.org/tutorial.html#multiselect){:target=_blank .external-link} allows you to select elements from a JSON object and combine them into a new list or object.
Given this JSON from a webhook node:
```js
[
{
"headers": {
"host": "n8n.instance.address",
...
},
"params": {},
"query": {},
"body": {
"people": [
{
"first": "James",
"last": "Green"
},
{
"first": "Jacob",
"last": "Jones"
},
{
"first": "Jayden",
"last": "Smith"
}
],
"dogs": {
"Fido": {
"color": "brown",
"age": 7
},
"Spot": {
"color": "black and white",
"age": 5
}
}
}
}
]
```
Use multiselect list to get the first and last names and create new lists containing both names:
```js
$jmespath($json.body.people, "[].[first, last]")
/* Returns:
[
{
"fullNames": [
[
"James",
"Green"
],
[
"Jacob",
"Jones"
],
[
"Jayden",
"Smith"
]
]
}
]
*/
```