Перейти к основному содержимому
Версия: 2.0 (WIP)

Уточнение запроса предикатными выражениями

Предикаты

На любом шаге пути выбранные элементы можно отфильтровать предикатом: [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" ]