ToolDeck

JSONPath Tester

Проверяйте JSONPath-выражения на JSON-данных и смотрите совпадающие результаты

Попробовать пример

JSON-ввод

Результаты

Работает локально · Безопасно вставлять секреты
Результаты появятся здесь…

Что такое JSONPath?

JSONPath — это язык запросов для извлечения значений из JSON-документов. Впервые предложенный Стефаном Гёсснером в 2007 году как аналог XPath для XML, JSONPath позволяет писать выражения вида $.store.book[*].author для выборки всех полей author из массива book без циклов и ручного обхода структуры. В феврале 2024 года язык был стандартизирован организацией IETF в виде RFC 9535.

JSONPath-выражение всегда начинается с $, обозначающего корень документа. Далее цепочкой идут селекторы: точечная нотация для ключей объектов, скобочная нотация для индексов массивов, подстановочные символы для всех дочерних элементов и оператор рекурсивного спуска (..) для поиска по всем уровням вложенности. Фильтрующие выражения вида [?(@.price < 10)] позволяют выбирать элементы по условиям, проверяемым относительно их значений.

JSONPath применяется в инструментах для тестирования API, таких как Postman, платформах наблюдаемости — Datadog и Splunk, в движках рабочих процессов, например Apache NiFi, а также в библиотеках для JavaScript, Python, Go, Java и C#. Проверка выражений на реальных данных до их внедрения в код или конфигурационные файлы позволяет избежать скрытых ошибок при несоответствии структуры JSON вашим ожиданиям.

Зачем использовать этот JSONPath Tester?

Писать JSONPath-выражения вручную непросто. Пропущенная точка, неправильный тип скобки или некорректный синтаксис фильтра могут возвращать пустые результаты без какого-либо сообщения об ошибке. Этот инструмент обеспечивает мгновенную визуальную обратную связь о том, что именно соответствует вашему выражению.

Мгновенные результаты
Вставьте JSON, введите выражение и наблюдайте за обновлением совпадающих значений в реальном времени. Нет необходимости запускать скрипт или перезагружать страницу для проверки запроса.
🔒
Приватность прежде всего
Все вычисления выполняются в браузере. Ваши JSON-данные никуда не передаются, поэтому вы можете безопасно проверять выражения на реальных ответах API или конфигурационных файлах, содержащих учётные данные.
📋
Копирование результатов одним кликом
Скопируйте найденные значения как JSON одним нажатием. Вставляйте их в тестовые утверждения, документацию или примеры ответов API без дополнительного форматирования.
🛠️
Не требует установки
Не нужно устанавливать npm-пакеты или создавать virtualenv для Python. Откройте страницу, вставьте данные и начните запросы. Работает на любом устройстве с браузером.

Применение JSONPath

Фронтенд-разработка
Извлекайте именно те вложенные значения, которые нужны из ответов API, перед их подключением к состоянию React или вычисляемым свойствам Vue. Сначала проверьте выражения на реальных данных API.
Тестирование бэкенд-API
Postman и REST-assured используют JSONPath для проверки тела ответов. Создавайте и проверяйте выражения для утверждений здесь, прежде чем копировать их в тестовые скрипты, — это сокращает количество циклов отладки.
Конфигурация DevOps
Пользовательские определения ресурсов Kubernetes, AWS Step Functions и источники данных Terraform принимают JSONPath-выражения для извлечения значений из JSON-вывода. Проверяйте путь перед развёртыванием.
Автоматизация тестирования QA
Пишите JSONPath-утверждения для контрактных и интеграционных тестов. Убедитесь, что ваши выражения корректно совпадают с ожидаемыми значениями, когда структура JSON содержит необязательные или допускающие null поля.
Извлечение данных в пайплайнах
Apache NiFi, Logstash и пользовательские ETL-скрипты используют JSONPath для извлечения полей из полуструктурированных лог-данных и потоков событий. Проверяйте выражения на примерах данных до развёртывания пайплайна.
Обучение и эксперименты
Студенты и разработчики, впервые знакомящиеся с JSONPath, могут опробовать различные выражения на примерах JSON, чтобы понять, как работают подстановочные символы, рекурсивный спуск и фильтры — без настройки локального окружения.

Справочник по синтаксису JSONPath

RFC 9535 определяет стандартный синтаксис JSONPath. В таблице ниже перечислены операторы, которые используются в большинстве запросов. Все выражения начинаются с $ (корневой узел) и содержат один или несколько селекторов для навигации по структуре документа.

ОператорОписаниеПример
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath vs jq vs XPath

JSONPath, jq и XPath решают одну и ту же задачу (запросы к структурированным данным) для разных форматов и сценариев использования. JSONPath ориентирован на JSON и доступен в виде библиотеки в большинстве языков программирования. jq — это автономный CLI-инструмент с собственным полным языком фильтрации. XPath работает с XML и является частью стека спецификаций W3C.

ВозможностьJSONPathjqXPath
Формат данныхJSONJSONXML
Доступ к первому элементу$.store.book[0].store.book[0]/store/book[1]
Рекурсивный поиск$..price.. | .price?//price
Фильтрующее выражение[?(@.price<10)]select(.price < 10)[price<10]
СпецификацияRFC 9535stedolan.github.ioW3C XPath 3.1

Примеры кода

Как вычислять JSONPath-выражения в популярных языках и инструментах. В каждом примере используется одна и та же JSON-структура книжного магазина для сравнения.

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

Часто задаваемые вопросы

В чём разница между JSONPath и jq?
JSONPath — это язык запросов, предназначенный для встраивания в приложения в виде библиотеки. Он возвращает совпадающие значения из JSON-документа с помощью path-выражений. jq — это автономный инструмент командной строки с полноценным языком программирования для преобразования JSON, включая условные операторы, функции и интерполяцию строк. Используйте JSONPath, когда нужен запрос, встроенный в код или такой инструмент, как Postman. Используйте jq для разовых преобразований данных в командной строке.
Является ли JSONPath официальным стандартом?
Да. IETF опубликовал RFC 9535 («JSONPath: Query Expressions for JSON») в феврале 2024 года. До этого JSONPath существовал лишь как неформальная спецификация Стефана Гёсснера 2007 года, что приводило к несовместимости между реализациями. RFC 9535 определяет синтаксис, семантику и формат нормализации для обеспечения совместимости.
Как работает рекурсивный спуск (..) в JSONPath?
Оператор рекурсивного спуска (..) выполняет поиск следующего за ним ключа на каждом уровне JSON-документа. Например, $..price возвращает все значения, связанные с ключом "price", независимо от глубины их вложенности. Это эквивалентно обходу в глубину с накоплением совпадающих узлов. Учтите, что на больших документах рекурсивный спуск может вернуть много результатов и работать медленнее прямого пути.
Может ли JSONPath изменять JSON-данные?
Нет. JSONPath — это язык запросов только для чтения. Он выбирает и возвращает значения, но не может вставлять, обновлять или удалять узлы. Для изменения JSON на основе JSONPath-выражения необходимо использовать функции работы с JSON в вашем языке программирования после выполнения запроса. Некоторые библиотеки, например jsonpath-ng для Python, предоставляют метод set() для объектов совпадений, но это расширение библиотеки, а не часть спецификации JSONPath.
Что означает символ @ в фильтрующих выражениях JSONPath?
Символ @ обозначает текущий узел, вычисляемый в фильтрующем выражении. В $.store.book[?(@.price < 10)] фильтр перебирает каждый элемент массива book, и @ представляет каждый объект книги по очереди. @.price обращается к полю price текущей книги. Без @ фильтр не мог бы знать, свойства какого узла нужно проверять.
Как обращаться к ключам со специальными символами или пробелами в JSONPath?
Используйте скобочную нотацию с кавычками: $['store']['book title']. Скобочная нотация работает для любого ключа, включая ключи с точками, пробелами или символами Unicode. Точечная нотация ($.store.key) работает только для ключей, являющихся допустимыми идентификаторами (буквы, цифры, знаки подчёркивания). RFC 9535 требует, чтобы реализации поддерживали как одинарные, так и двойные кавычки в скобочной нотации.
Почему моё JSONPath-выражение возвращает пустые результаты?
Наиболее распространённые причины: опечатка в имени ключа (JSONPath чувствителен к регистру), использование точечной нотации для ключа с специальными символами, отсутствие корневого символа $ в начале или предположение, что значение является массивом, тогда как оно является одиночным объектом. Вставьте JSON в тестер и попробуйте более простые подвыражения (например, $.store), чтобы убедиться в корректности каждого сегмента пути, прежде чем добавлять новые селекторы.