Как извлекать и трансформировать данные в Нейро42 с помощью мощного языка запросов
JMESPath — это язык запросов к JSON, который позволяет легко находить, фильтровать и преобразовывать данные. Он отлично подходит для работы со сложными вложенными структурами, особенно когда в сообщениях API приходит слишком много лишнего.
Метод $jmespath() в n8n
В n8n доступен специальный метод:
$jmespath(object, searchString)
Он делает то же, что и:
var jmespath = require(‘jmespath’);
jmespath.search(object, searchString);
Только компактнее — и работает прямо в Выражениях.
В Выражениях код должен быть однострочным, поэтому длинные варианты использовать нельзя.
Параметры
- object — JSON-объект (например, $json, $node.<name>.json).
- searchString — строка с JMESPath-запросом.
Важно: порядок параметров
В официальной документации примеры идут как search(searchString, object).
Но библиотека JavaScript использует формат: search(object, searchString).
В Нейро42 используем второй вариант.
Примеры частых задач
Для примеров используем JSON из Webhook:
[
{
«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 }
}
}
}
]
Перед тестированием установите Code node → Mode: Run Once for Each Item
Примеры JMESPath в Нейро42
- Получить список всех имен людей
{{$jmespath($json.body.people, «[*].first»)}}
Результат:
[«James», «Jacob», «Jayden»]
- Взять только первые два имени (Slice Projection)
{{$jmespath($json.body.people, «[:2].first»)}}
Результат:
[«James», «Jacob»]
- Получить список возрастов всех собак (Object Projection)
{{$jmespath($json.body.dogs, «*.age»)}}
Результат: [7, 5]
- Использовать multiselect для объединения данных
Получим пары [first, last]:
{{$jmespath($json.body.people, «[].[first, last]»)}}
Результат:
[
[«James», «Green»],
[«Jacob», «Jones»],
[«Jayden», «Smith»]
]
Пример: альтернативы стрелочным функциям
Допустим, Code node возвращает такой список:
return [
{ json: { name: «HP», category_id: 5529735, num_products: «45» } },
{ json: { name: «Lenovo», category_id: 5529740, num_products: «86» } }
];
И вы хотите найти category_id для элемента с именем Lenovo.
Используем JMESPath-фильтр:
{{ $jmespath($(«Code»).all(), «[?json.name==’Lenovo’].json.category_id») }}
Результат: [5529740]
Дополнительные возможности JMESPath
JMESPath поддерживает:
- фильтры ([?condition])
- проекции для массивов и объектов
- построение новых структур ({name: field, …})
- сортировку, агрегацию и трансформации
Полную документацию можно изучить на сайте JMESPath.