Запрос JSONPath
Последнее обновление: 2 октября 2026 г.
Выполните выражение JSONPath по документу JSON и увидьте каждое совпадение с путём, где оно найдено. Запрос выполняется в браузере, документ никуда не отправляется.
Что умеет язык запросов
JSONPath для JSON — то же, что путь к папке для файловой системы: краткий способ сказать, какие значения нужны. $ — корень документа, .name ведёт к свойству, а […] выбирает внутри массива.
- Дочерние узлы:
$.store.bicycle.color, или$['store']['bicycle']['color'], когда имя нужно взять в кавычки. - Подстановки:
$.store.book[*].titleберёт название каждой книги;$.store.*— все значения объекта store. - Рекурсивный спуск:
$..priceнаходитpriceна любой глубине. Мощно и легко переусердствовать — см. ниже. - Индексы и срезы:
[0],[-1]для последнего,[0:2]для первых двух,[0:5:2]с шагом. - Объединения:
[0,2]и['book','bicycle']выбирают несколько сразу. - Фильтры:
[?(@.price < 10)]оставляет элементы дешевле десяти; операторы== != < <= > >=, комбинации через&&и||.
Фильтры проверяют наличие, а не истинность
Одиночный путь в фильтре спрашивает, есть ли свойство. Поэтому [?(@.inStock)] совпадает с элементом, у которого inStock равно false, — свойство существует. Так фильтр трактуется в RFC 9535. Когда важно значение, укажите это явно: [?(@.inStock == true)]. Это самый частый сюрприз в JSONPath, и он свойство языка, а не этого инструмента.
Что намеренно не делается
Функции фильтров вроде length(), match() и search() не реализованы, как и регулярные выражения, скриптовые выражения в скобках и расширения некоторых библиотек (ссылки на родителя и соседей). Запрос с ними отклоняется с сообщением, а не возвращает молча неверный результат — страница заявляет свои возможности, поэтому «совпадение» здесь означает именно это.
Частые вопросы
Какой синтаксис JSONPath поддерживается?
Корень $, доступ к дочерним узлам через .name или ['name'], подстановки .* и [*], рекурсивный спуск ..name и ..*, индексы массива включая отрицательные, срезы [start:end:step], объединения вида [0,1] и ['a','b'], а также фильтры [?(@.price < 10)] с операторами == != < <= > >= и комбинациями через && и ||.
Что не поддерживается?
Функции фильтров вроде length(), match() и search(), регулярные выражения, скриптовые выражения в скобках и расширения, которые добавляют некоторые библиотеки, например ссылки на родителя и соседей. Запрос с ними отклоняется, а не возвращает молча неверный результат.
Почему ?(@.inStock) совпадает с элементами, где inStock равно false?
Потому что одиночный путь в фильтре проверяет наличие, а не истинность: он спрашивает, есть ли свойство, а свойство, равное false, всё равно есть. Для проверки значения укажите явно: ?(@.inStock == true). Так фильтр трактуется в RFC 9535.
Результат показывает, откуда он взялся?
Да. Каждый результат выводится с путём, по которому найден, в той же записи с точками и скобками, что и в запросе, поэтому путь можно вставить обратно в запрос или в другой инструмент JSON.
Мой документ загружается куда-нибудь?
Нет. Документ разбирается через JSON.parse в вашем браузере, а запрос выполняется в памяти. Ничего не загружается, и страница работает при отключённой сети.
Почему $..price вернул больше, чем я ожидал?
Рекурсивный спуск посещает каждый уровень документа, поэтому ..price находит свойство price где угодно — в массивах, вложенных объектах и посторонних ветвях. Чтобы сузить, привяжите запрос к большему пути, например $.store.book[*].price.
Хотите проверить документ по схеме? Для этого есть JSON Schema. Нашли ошибку? Свяжитесь с нами.