В этом разделе приведены сведения о поддерживаемом JSONPath функционале в шагах предварительной обработки значений элементов данных.
JSONPath состоит из сегментов, разделенных точками. Сегмент может быть либо простым словом, например имя значения JSON, либо *, либо более сложной конструкцией, заключённой в квадратные скобки [ ]. Разделительная точка перед сегментом скобки является опциональной и её можно опустить. Например:
| Путь | Описание | 
|---|---|
| $.object.name | Возвращает содержимое object.name. | 
| $.object['name'] | Возвращает содержимое object.name. | 
| $.object.['name'] | Возвращает содержимое object.name. | 
| $["object"]['name'] | Возвращает содержимое object.name. | 
| $.['object'].["name"] | Возвращает содержимое object.name. | 
| $.object.history.length() | Возвращает количество элементов массива object.history. | 
| $[?(@.name == 'Object')].price.first() | Возвращает поле price первого объекта с именем 'Object'. | 
| $[?(@.name == 'Object')].history.first().length() | Возвращает количество элементов массива history первого объекта с именем 'Object'. | 
| $[?(@.price > 10)].length() | Возвращает количество объектов с price больше чем 10. | 
Смотрите также: Экранирование специальных символов из значений LLD макросов в JSONPath.
| Сегмент | Описание | 
|---|---|
| <имя> | Соответствие свойству объекта по имени. | 
| * | Соответствие всем свойствам объекта. | 
| ['<имя>'] | Соответствие свойству объекта по имени. | 
| ['<имя>', '<имя>', ...] | Соответствие свойству объекта по любому из перечисленных имён. | 
| [<индекс>] | Соответствие элементу массива по его индексу. | 
| [<число>, <число>, ...] | Соответствие элементу массива по любому из перечисленных индексов. | 
| [*] | Соответствие всем свойствам объекта или элементам массива. | 
| [<начало>:<конец>] | Соответствие элементам массива по заданному диапазону: <начало> - первый индекс соответствия (включительно). Если не указан, соответствует всем элементам с самого начала. Если указан отрицательным значением, задаёт начало смещения с конца массива. <конец> - последний индекс соответствия (не включая). Если не указан, соответствует всем элементам массива до самого конца. Если указан отрицательным значением, задаёт начало смещения с конца массива. | 
| [?(<выражение>)] | Соответствие объектов / элементов массива с применением выражения фильтра. | 
Чтобы найти соответствующий сегмент, игнорируя его происхождение (отсоединенный сегмент), его необходимо указывать с префиксом '..', например $..name или $..['name'] вернёт значения всех свойств 'name'.
Соответствующие имена элементов можно извлечь, добавив суффикс ~ к JSONPath. Он возвращает имя соответствующего объекта или индекс в строковом формате соответствующего элемента массива. Формат вывода следует тем же самым правилам, что и остальные JSONPath запросы - результаты определенного пути возвращаются 'как есть', а результаты неопределенного пути возвращаются в виде массива. Однако, нет особого смысла извлекать имя соответствующего элемента определенного пути - оно и так уже известно.
Выражение фильтра является арифметическим выражением в инфиксном представлении.
Поддерживаемые операнды:
| Операнд | Описание | Пример | 
|---|---|---|
| "<текст>"'<text>' | Текстовая константа. | 'value: \'1\'' "value: '1'" | 
| <число> | Числовая константа, поддерживая научное представление. | 123 | 
| <jsonpath начиная с $> | Значение, указанное в JSONPath, начиная с корневого узла входного документа; поддерживаются только определённые пути. | $.object.name | 
| <jsonpath начиная с @> | Значение, указанное в JSONPath, начиная с текущего объекта / элемента; поддерживаются только определенные пути. | @.name | 
Поддерживаемые операторы:
| Оператор | Тип | Описание | Результат | 
|---|---|---|---|
| - | бинарный | Вычитание. | Число. | 
| + | бинарный | Сложение. | Число. | 
| / | бинарный | Деление. | Число. | 
| * | бинарный | Умножение. | Число. | 
| == | бинарный | Равно. | Логический (1 или 0). | 
| != | бинарный | Не равно. | Логический (1 или 0). | 
| < | бинарный | Меньше чем. | Логический (1 или 0). | 
| <= | бинарный | Меньше чем или равно. | Логический (1 или 0). | 
| > | бинарный | Больше чем. | Логический (1 или 0). | 
| >= | бинарный | Больше чем или равно. | Логический (1 или 0). | 
| =~ | бинарный | Соответствие регулярному выражению. | Логический (1 или 0). | 
| ! | унарный | Логическое НЕ. | Логический (1 или 0). | 
| \|\| | бинарный | Логическое ИЛИ. | Логический (1 или 0). | 
| && | бинарный | Логическое И. | Логический (1 или 0). | 
Функции можно использовать в конце JSONPath. Несколько функций можно включать в цепочку, если предыдущая функция возвращает значение, которое принимается следующей функцией.
Поддерживаемые функции:
| Функция | Описание | Вход | Выход | 
|---|---|---|---|
| avg | Среднее значение из чисел во входящем массиве. | Массив чисел. | Число. | 
| min | Минимальное значение из чисел во входящем массиве. | Массив чисел. | Число. | 
| max | Максимальное значение из чисел во входящем массиве. | Массив чисел. | Число. | 
| sum | Сумма чисел во входящем массиве. | Массив чисел. | Число. | 
| length | Количество элементов во входящем массиве. | Массив. | Число. | 
| first | Первый элемент массива. | Массив. | Конструкция JSON (объект, массив, значение), в зависимости от содержимого входящего массива. | 
Функциями агрегации JSONPath принимаются числовые значения в кавычках. Это означает что значения преобразуются из строкового типа в числовой, если требуется агрегирование.
Несовместимые входящие данные повлекут ошибку в функции.
JSONPath можно разделить на определённые и неопределённые пути. Определённый путь может вернуть только null или одно совпадение. Неопределённый путь может вернуть несколько совпадений, в основном JSONPath с отсоединенными несколькими именами / списком индексов, фрагментом массива или сегментами выражения. Однако, когда используется функция, JSONPath становится определённым, так как функции всегда имеют одиночное результирующее значение.
Определённый путь возвращает объект/массив/значение, на которое он ссылается, тогда как неопределённый путь возвращает массив соответствующих объектов/массивов/значений.
Пробелы (пробелы как таковые, символы табуляции) можно свободно использовать в сегментах с представлением в виде квадратных скобок и в выражениях, например, $[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( ).
Строки должны быть заключены в одинарные ' или двойные " кавычки. Внутри строк одинарные или двойные кавычки (в зависимости от того, в какие кавычки заключена строка) и обратные косые черты \ экранируются при помощи символа косой черты \.
{
         "books": [
           {
             "category": "reference",
             "author": "Nigel Rees",
             "title": "Sayings of the Century",
             "price": 8.95,
             "id": 1
           },
           {
             "category": "fiction",
             "author": "Evelyn Waugh",
             "title": "Sword of Honour",
             "price": 12.99,
             "id": 2
           },
           {
             "category": "fiction",
             "author": "Herman Melville",
             "title": "Moby Dick",
             "isbn": "0-553-21311-3",
             "price": 8.99,
             "id": 3
           },
           {
             "category": "fiction",
             "author": "J. R. R. Tolkien",
             "title": "The Lord of the Rings",
             "isbn": "0-395-19395-8",
             "price": 22.99,
             "id": 4
           }
         ],
         "services": {
           "delivery": {
             "servicegroup": 1000,
             "description": "Next day delivery in local town",
             "active": true,
             "price": 5
           },
           "bookbinding": {
             "servicegroup": 1001,
             "description": "Printing and assembling book in A5 format",
             "active": true,
             "price": 154.99
           },
           "restoration": {
             "servicegroup": 1002,
             "description": "Various restoration methods",
             "active": false,
             "methods": [
               {
                 "description": "Checmical cleaning",
                 "price": 46
               },
               {
                 "description": "Pressing pages damaged by moisture",
                 "price": 24.5
               },
               {
                 "description": "Rebinding torn book",
                 "price": 99.49
               }
             ]
           }
         },
         "filters": {
           "price": 10,
           "category": "fiction",
           "no filters": "no \"filters\""
         },
         "closed message": "Store is closed",
         "tags": [
           "a",
           "b",
           "c",
           "d",
           "e"
         ]
       }| JSONPath | Тип | Результат | Комментарии | 
|---|---|---|---|
| $.filters.price | определённый | 10 | |
| $.filters.category | определённый | fiction | |
| $.filters['no filters'] | определённый | no "filters" | |
| $.filters | определённый | { "price": 10, "category": "fiction", "no filters": "no \"filters\"" } | |
| $.books[1].title | определённый | Sword of Honour | |
| $.books[-1].author | определённый | J. R. R. Tolkien | |
| $.books.length() | определённый | 4 | |
| $.tags[:] | неопределённый | ["a", "b", "c", "d", "e" ] | |
| $.tags[2:] | неопределённый | ["c", "d", "e" ] | |
| $.tags[:3] | неопределённый | ["a", "b", "c"] | |
| $.tags[1:4] | неопределённый | ["b", "c", "d"] | |
| $.tags[-2:] | неопределённый | ["d", "e"] | |
| $.tags[:-3] | неопределённый | ["a", "b"] | |
| $.tags[:-3].length() | определённый | 2 | |
| $.books[0, 2].title | неопределённый | ["Sayings of the Century", "Moby Dick"] | |
| $.books[1]['author', "title"] | неопределённый | ["Evelyn Waugh", "Sword of Honour"] | |
| $..id | неопределённый | [1, 2, 3, 4] | |
| $.services..price | неопределённый | [5, 154.99, 46, 24.5, 99.49] | |
| $.books[?(@.id == 4 - 0.4 * 5)].title | неопределённый | ["Sword of Honour"] | Этот запрос показывает, что в запросах можно использовать математические операции. Конечно, этот запрос можно упростить до $.books[?(@.id == 2)].title | 
| $.books[?(@.id == 2 \|\| @.id == 4)].title | неопределённый | ["Sword of Honour", "The Lord of the Rings"] | |
| $.books[?(!(@.id == 2))].title | неопределённый | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
| $.books[?(@.id != 2)].title | неопределённый | ["Sayings of the Century", "Moby Dick", "The Lord of the Rings"] | |
| $.books[?(@.title =~ " of ")].title | неопределённый | ["Sayings of the Century", "Sword of Honour", "The Lord of the Rings"] | |
| $.books[?(@.price > 12.99)].title | неопределённый | ["The Lord of the Rings"] | |
| $.books[?(@.author > "Herman Melville")].title | неопределённый | ["Sayings of the Century", "The Lord of the Rings"] | |
| $.books[?(@.price > $.filters.price)].title | неопределённый | ["Sword of Honour", "The Lord of the Rings"] | |
| $.books[?(@.category == $.filters.category)].title | неопределённый | ["Sword of Honour","Moby Dick","The Lord of the Rings"] | |
| $..[?(@.id)] | неопределённый | [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "id": 1 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "id": 2 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "id": 3 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "id": 4 } ] | |
| $.services..[?(@.price > 50)].description | неопределённый | '["Printing and assembling book in A5 format", "Rebinding torn book"] | |
| $..id.length() | определённый | 4 | |
| $.books[?(@.id == 2)].title.first() | определённый | Sword of Honour | |
| $..tags.first().length() | определённый | 5 | $..tags - неопределённый путь, поэтому он вернёт массив соответствующих элементов - [["a", "b", "c", "d", "e" ]], first() вернёт первый элемент - ["a", "b", "c", "d", "e" ] и, наконец, length() вычислит его размер - 5. | 
| $.books[*].price.min() | определённый | 8.95 | |
| $..price.max() | определённый | 154.99 | |
| $.books[?(@.category == "fiction")].price.avg() | определённый | 14.99 | |
| $.books[?(@.category == $.filters.xyz)].title | неопределённый | Запрос без совпадения вернёт NULL по определённому и неопределённому путям. | |
| $.services[?(@.active=="true")].servicegroup | неопределённый | [1000,1001] | В сравнениях логических значений необходимо использовать текстовые константы. | 
| $.services[?(@.active=="false")].servicegroup | неопределённый | [1002] | В сравнениях логических значений необходимо использовать текстовые константы. | 
| $.services[?(@.servicegroup=="1002")]~.first() | определенный | restoration | |