Уточнение запроса предикатными выражениями
Предикаты
На любом шаге пути выбранные элементы можно отфильтровать предикатом: [expr], где expr вычисляется в логическое значение. Каждый элемент выборки проверяется этим выражением: при true элемент сохраняется, при false удаляется. Выражение вычисляется относительно проверяемого текущего (контекстного) элемента, поэтому навигация внутри предиката также начинается от него.
Примеры
-
Выбрать элементы
Phone, у которых полеtypeравно"mobile":Phone[type='mobile']{ "type": "mobile", "number": "077 7700 1234" } -
Выбрать номер мобильного телефона:
Phone[type='mobile'].number"077 7700 1234" -
Выбрать номера офисных телефонов — их два:
Phone[type='office'].number[ "01962 001234", "01962 001235" ]
Эквивалентность одноэлементного массива и значения
В выражении или подвыражении JSONata любое значение, которое само не является массивом, и массив, содержащий только это значение, считаются эквивалентными. Благодаря этому язык композиционен: пути, извлекающие единственное значение из объекта, и пути, извлекающие несколько значений из массивов, можно передавать другим выражениям без разного синтаксиса для этих двух случаев.
Примеры:
Address.Cityвозвращает единственное значение"Winchester";Phone[0].numberнаходит и возвращает единственное значение"0203 544 1234";Phone[type='home'].numberтакже находит единственное значение"0203 544 1234";Phone[type='office'].numberнаходит два значения и возвращает массив[ "01962 001234", "01962 001235" ].
При обработке результата выражения JSONata иногда нужен единый формат вне зависимости от количества совпадений. В первых двух случаях понятно, что путь адресует единственное значение, поэтому естественно вернуть само значение. В последних двух заранее не ясно, сколько значений совпадёт; неудобно, если вызывающему языку приходится по-разному обрабатывать результаты.
Если это важно, измените выражение так, чтобы оно возвращало массив даже при одном совпадении. Для этого добавьте пустые квадратные скобки [] на шаге пути:
Address[].Cityвозвращает[ "Winchester" ];Phone[0][].numberвозвращает[ "0203 544 1234" ];Phone[][type='home'].numberвозвращает[ "0203 544 1234" ];Phone[type='office'].number[]возвращает[ "01962 001234", "01962 001235" ].
[] можно ставить по любую сторону от предикатов и на любом шаге выражения пути.
Подстановочные символы
Используйте * вместо имени поля, чтобы выбрать все поля объекта.
Примеры
-
Выбрать значения всех полей
Address:Address.*[ "Hursley Park", "Winchester", "SO21 2JN" ] -
Выбрать значение
Postcodeлюбого дочернего объекта:*.Postcode"SO21 2JN"
Навигация на произвольную глубину
Подстановочный символ потомков **, в отличие от *, обходит всех потомков (многоуровневый wildcard).
Пример
-
Выбрать все значения
Postcodeнезависимо от глубины вложенности:**.Postcode[ "SO21 2JN", "E1 6RF" ]