Инструменты
Руководства

JSONPath-запрос

JSON

Выполняйте запросы JSONPath / в стиле jq по документу JSON и подсвечивайте каждое совпадение.

100 % на клиенте Без бэкенда

Удалённые URL не запрашиваются; вставьте JSON напрямую.

Ввод
Совпадения
JSON совпадения подсвечены
Вставьте JSON и выражение JSONPath для поиска совпадений.
На этой странице

Что такое тестер JSONPath?#

Когда JSON-документ невелик, его читают глазами. Когда он размером в несколько тысяч строк — ответ API, дамп конфига, дерево зависимостей — глаза перестают быть подходящим инструментом. JSONPath — это язык запросов для такой ситуации: компактное выражение, которое говорит «дай мне каждое поле price», или «заголовки книг дешевле 10», или «каждый узел с именем isbn, на какой бы глубине он ни залегал».

Считайте это помесью файлового пути и крошечного языка фильтров. $.store.book[0].title спускается по известной структуре, как файловый путь. $..author означает «рекурсивно спуститься и собрать каждого найденного author». [?(@.price < 10)] — фильтр: оставить только элементы, у которых price текущего узла меньше десяти. @ всегда означает «узел, который я сейчас рассматриваю».

Эта страница выполняет выражение JSONPath по вашему JSON, перечисляет каждое совпадение и — то, что экономит больше всего времени, — подсвечивает совпавшие диапазоны прямо на отформатированном документе, чтобы с одного взгляда было видно, выбрало ли ваше выражение то, что вы думали. Фильтры вычисляются безопасным парсером выражений, а не исполнением кода, поэтому недоверенный блок ничего не запустит.

Как пользоваться#

  1. Вставьте JSON в панель Ввод слева или нажмите Пример, чтобы загрузить классическую фикстуру книжного магазина.
  2. Введите выражение JSONPath в поле JSONPath справа. Типичные отправные точки:
    • $.store.book[*].authorauthor каждого элемента массива.
    • $..author — рекурсивный спуск: каждый author, где угодно.
    • $.store.book[?(@.price < 10)].title — выражение-фильтр.
    • $.store.book[?(@.isbn)].isbn — проверка существования (есть ключ isbn).
  3. Список совпадений под полем заполняется одной записью на результат, а полноширотный предпросмотр JSON под ним подсвечивает каждый совпавший фрагмент по месту.
  4. Заголовок рядом с Совпадениями показывает счётчик. Выражение, совпадающее с нулём узлов, всё равно сообщает об успехе (пустой список) — ошибку показывает только синтаксически сломанное выражение.
  5. Нажмите Копировать совпадения на панели инструментов, чтобы забрать совпавшие значения как JSON-массив, или Очистить, чтобы сбросить обе панели.

Запросы запускаются по мере ввода. Если сам JSON некорректен, строка состояния указывает точные строку и столбец для исправления.

Ключевые возможности#

  • Подсветка по месту. Каждое совпавшее значение накладывается на отформатированный документ, поэтому рекурсивный $.., хватающий тридцать узлов, мгновенно виден, а не погребён в списке.
  • Безопасное вычисление фильтров. Выражения вроде [?(@.price < 10)] разбираются вычислителем выражений, а не передаются динамическому исполнению кода, — страница остаётся безопасной для CSP даже на враждебном вводе.
  • Различие «нет совпадений» и «ошибка». Корректное выражение, ничего не выбравшее, сообщается как ноль совпадений; как ошибка помечается только malformed-выражение. Вы никогда не перепутаете «ничего не нашлось» со «сломалось».
  • Указатель на каждое совпадение. Каждый результат несёт свой JSON Pointer (например /store/book/2/title), поэтому точно известно, откуда в дереве взялось значение.
  • Копирование как массив. Совпавшие значения экспортируются как чистый JSON-массив, готовый передать следующему шагу.
  • Только локально. Данные запрашиваются в браузере. Бэкенда и выгрузки нет.

Разбор примера#

Загрузите Пример, затем выполните фильтр, который находит заголовки дешёвых книг. Введите в поле JSONPath:

$.store.book[?(@.price < 10)].title

Список совпадений вернёт два заголовка, потому что только две из четырёх книг в фикстуре стоят дешевле 10:

[
  "Sayings of the Century",
  "Moby Dick"
]

Предпросмотр JSON подсвечивает эти два значения title по месту, и видно, почему две другие исключены — Sword of Honour (12.99) и The Lord of the Rings (22.99) лежат выше порога. Переключитесь на проверку существования, чтобы найти, у каких книг есть ISBN:

$.store.book[?(@.isbn)].isbn

Это вернёт две строки ISBN и ничего больше, потому что фильтр оставляет только элементы, у которых действительно есть ключ isbn, — удобный шаблон для поиска «какие записи без поля» через его отрицание.

FAQ#

В чём разница между $ и @?#

$ — корень документа, всё JSON-значение, которое вы вставили. @ — текущий рассматриваемый узел внутри фильтра. Поэтому в [?(@.price < 10)] @ относится к той книге, которую фильтр проверяет прямо сейчас; запись $.price там прыгнула бы обратно в корень и искала бы price верхнего уровня, которого не существует.

Моё выражение ничего не находит. Это баг?#

Скорее всего нет. Корректное выражение, выбирающее ноль узлов, — успешный запрос с пустым результатом, например $.store.book[?(@.price > 1000)] на образце просто означает, что ни одна книга не стоит так дорого. Заголовок показывает «0 совпадений» без ошибки. Ошибку страница сообщает, только когда само выражение не разбирается.

Почему фильтр не исполняет произвольный JavaScript?#

Фильтры вычисляются выделенным парсером выражений, который понимает сравнения, булевы операторы и @-ссылки, — он никогда не строит и не запускает код. Это сделано намеренно: это держит инструмент безопасным, чтобы указывать его на JSON, которому вы не полностью доверяете, и удерживает страницу в рамках content security policy браузера.

Может ли JSONPath редактировать или удалять узлы?#

Нет — это инструмент запросов только для чтения. Он выбирает и отображает, но не меняет ваш JSON. Если вы хотите увидеть, чем два документа отличаются, возьмите инструмент /en/json/diff/.