Первый раз, когда я написал выражение JSONPath, которое имело значение, я трижды ошибался, прежде чем оно заработало, и я знал, что оно было неправильным только потому, что API-шлюз, который я настраивал, возвращал пустую политику вместо поля, которое я хотел. петли обратной связи не было. я бы редактировал выражение, перераспределял и ждал. как только я начал держать тестер JSONPath открытым на другой вкладке, эта же работа заняла две минуты вместо дня. Это руководство о том, как я использую Тестер JSONPath на Toolz.dev, что на самом деле делает синтаксис, и маленькие ловушки, которые делают выражение, ничего не возвращают, когда вы были уверены, что оно должно совпадать.
TL;DR: JSONPath - это язык запросов для JSON, то же самое, что XPath для XML. Тестер JSONPath оценивает такое выражение, как
$.store.book[*].authorпротив документа и возвращает каждое совпадающее значение плюс его путь. The Тестер JSONPath делает это полностью в вашем браузере, с поддержкой подстановочных знаков, рекурсивного спуска, фрагментов, объединений и выражений фильтра, поэтому вы можете построить и отладить запрос на основе реальных данных, прежде чем вставить его в код.
Что такое JSONPath?
JSONPath - это компактный синтаксис для выбора частей документа JSON. Вы пишете короткий путь, описывающий маршрут через данные, и его оценка возвращает значение или значения на этом маршруте. идея исходит от Стефан Гесснер и №39;s предложение 2007 года, который намеренно отражал XPath, чтобы любой, кто запрашивал XML, чувствовал себя как дома. В течение многих лет не было формальной спецификации, только эта статья и семейство реализаций, которые в основном соглашались, и в начале 2024 года IETF опубликовал РФЦ 9535 чтобы закрепить грамматику.
Вы встречаете JSONPath чаще, чем могли ожидать Это язык селектора в инструментах тестирования API, таких как Postman и Karate, в Kubernetes kubectl форматирование вывода, в функциях AWS CloudWatch и Step, в процессорах журналов и на десятках платформ с низким кодом, где пользователю необходимо вытащить одно поле из полезной нагрузки веб-крючка без записи кода. Изучение этого однажды окупается во всех этих.
Мысленная модель проста. документ JSON - это дерево. Объекты назвали ветви, массивы имеют пронумерованные ветви, а листья - это ваши скалярные значения. Выражение JSONPath - это набор направлений для ходьбы по этому дереву, и в результате получается каждый лист или поддерево, на которое вы приземляетесь. Где оно становится мощным, так это то, что одно выражение может приземлиться во многих местах одновременно.
Что на самом деле делает тестер JSONPath?
Тестер принимает два входа, ваш JSON и выражение, и показывает вам каждый узел выражение выбирает Это звучит очевидно, но значение находится в обратной связи Когда выражение не возвращает ничего, или возвращает больше, чем вы ожидали, тестер превращает игру угадывания в двухсекундную проверку, потому что вы можете увидеть, какие именно узлы совпадают и настроить один символ за раз.
На Toolz.dev поток короткий.Вставить документ JSON, или загрузить образец книжного хранилища, который используется большинством JSONPath учебных пособий, ввести выражение, и оценить. инструмент перечисляет каждое согласованное значение с текущим счетом, и вы можете переключать вывод между тремя представлениями. значения дает вам только результаты как JSON массив. пути дает вам нормализованное местоположение каждого совпадения, что является самым быстрым способом обнаружить выражение, которое вам действительно нужно. записи дают вам оба вместе, так что вы можете видеть путь и значение рядом.
Причина, чтобы проверить против реальных данных, а не рассуждения о нем в вашей голове, заключается в том, что JSON из дикой природы более беспорядочен, чем примеры. Поле иногда является объектом, а иногда и массивом. Ключ, который вы ожидали, отсутствует в половине записей. Число пришло в виде строки. запуск выражения против фактической полезной нагрузки сразу же, а не во время развертывания, выявляет эти сюрпризы.
Как выбрать элементы из массива?
Массивы - это то место, где происходит большая часть работы JSONPath, и есть четыре способа их устранения.
Один индекс выбирает один элемент. $.store.book[0] возвращает первую книгу, и JSONPath, как и большинство языков, отсчитывает от нуля. отрицательный индекс отсчитывает от конца, так что $.store.book[-1] возвращает последнюю книгу без необходимости знать, сколько их. Эта отрицательная форма действительно полезна, когда вы хотите самый последний элемент в журнале или последнюю запись в ленте.
Подстановочный знак выбирает каждый элемент. $.store.book[*] возвращает все четыре книги, и $.store.book[*].author возвращает автора каждого, давая вам чистый массив авторов Подстановочный знак также работает на объектах, где $.store.* возвращает каждое значение объекта хранилища независимо от ключа.
Союз выбирает определенный набор. $.store.book[0,2] возвращает первую и третью книги, и с именами работает один и тот же синтаксис запятых, так что $['store']['bicycle'] а клавиши с скобками позволяют обращаться к клавишам, содержащим пробелы или знаки препинания, которые не могут быть указаны в форме точки.
Слайс выбирает диапазон, заимствуя Python's start:end:step форма. $.store.book[:2] берет первые два, $.store.book[1:3] принимает средний диапазон с эксклюзивным конечным индексом, $.store.book[::2] принимает каждый второй элемент, и $.store.book[::-1] переворачивает массив. срезы - это наименее известная часть синтаксиса и та, которая сохраняет наибольшее количество типизаций, как только она у вас есть.
Что делает двойная точка?
Двойная точка - это рекурсивное снижение, и именно эта функция заставляет JSONPath чувствовать себя поиском, а не путем. $..author находит каждый author ключ в любом месте документа, независимо от того, насколько глубоко он вложен, и $..* возвращает каждое значение на каждом уровне Когда вы не знаете точную форму документа, или когда одно и то же поле появляется на нескольких глубинах, рекурсивный спуск находит все их в одном выражении.
Рассмотрим образец книжного магазина. $..price возвращает пять значений, цены на четыре книги и цену велосипеда, потому что он опускается в каждый объект и собирает каждый price оно находит. Равнина $.store.book[*].price вернул бы только четыре цены на книги, потому что он идет по фиксированному маршруту Разница между этими двумя выражениями заключается в разнице между запросом цен в известном месте и запросом цен в любом месте.
Рекурсивный спуск достаточно мощный, чтобы быть опасным, в том смысле, что он может соответствовать больше, чем вы имели в виду, Именно поэтому здесь важен тестер. бегите $..name против незнакомой полезной нагрузки, и вы можете обнаружить, что она соответствует имени пользователя, имени продукта и имени файла, который вы понятия не имели, разделял ключ. Видеть пути в выводе говорит вам, сужать ли выражение, прежде чем полагаться на него.
Как работают выражения фильтра?
Фильтр сохраняет только те элементы, для которых условие истинно, и оно записывается [?(...)] с @ обозначает текущий элемент. $.store.book[?(@.price < 10)] возвращает книги дешевле десяти Внутри фильтра можно сравнить поле с литералом с операторами ==, !=, <, <=, >, и >=, проверьте простое наличие поля и объедините условия с && а ||, йо-
Несколько конкретных примеров проясняют форму:
$.store.book[?(@.category == "fiction")]выбирает названия художественной литературы.$.store.book[?(@.price < 10 && @.category == "fiction")]сужается до дешевой художественной литературы.$.store.book[?(@.isbn)]выбирает только книги, имеющие ISBN, используя существование, а не сравнение.$.vals[?(@ > 2)]фильтрует простой массив чисел, где@само по себе относится к самому элементу.
Единственная наиболее распространенная ошибка фильтра - несоответствие типов. В JSON, "12" а 12 являются различными значениями, поэтому фильтр, который сравнивает числовое поле с цитируемым числом, или строковое поле с голым числом, молча ничего не соответствует Когда фильтр удивляет вас, первое, что нужно проверить, являются ли поле и литерал одним типом Тестирование выражения против реальных данных, где вы можете увидеть фактические значения, это то, как вы поймаете это за секунды, а не после неудачного развертывания.
JSONPath против JSON Pointer против JSON diff
Все эти три инструмента касаются структуры JSON, но они отвечают на разные вопросы, а выбор неправильного теряет время. Вот как они сравнивают:
| подход | Ответы | спичка | лучше для |
|---|---|---|---|
| JSONPath | Какие узлы удовлетворяют этому запросу? | Ноль, один или много | Извлечение полей, фильтрация массивов, исследование неизвестных форм |
| JSON Pointer (RFC 6901) | Что именно в этом месте? | Всегда ровно один | Ссылка на одно фиксированное поле, как в схеме JSON $ref |
| JSON дифф | Что изменилось между двумя документами? | Набор изменений | Сравнение двух версий одних и тех же данных |
Указатель JSON, определенный в РФЦ 6901, обращается к одному точному месту с помощью пути, разделенного косой чертой /store/book/0/title, и он никогда не использует подстановочные знаки или фильтры. Доберитесь до него, когда вам нужно однозначно назвать одно поле. Доберитесь до JSONPath, когда одно выражение должно выбрать набор полей. И когда ваш реальный вопрос заключается в том, что отличается между двумя полезными нагрузками, а не в том, что выбирает запрос, a JSON диф является правильным инструментом Знать, кто из трех вам действительно нужен, это половина битвы.
Почему мое выражение лица не приносит результатов?
Пустой результат почти всегда возникает по одной из нескольких причин, и тестер позволяет вам быстро его исключить.
Первый - структурное несоответствие Вы написали $.data.items.name когда items это массив, поэтому вам нужен $.data.items[*].name с подстановочным знаком. форма точки входит в объект, а массив не является объектом с a name ключ, так что путь тупиков Переключение выходного представления на пути и шаг выражения по одному сегменту за раз показывает вам, где именно оно перестает совпадать.
Второй - орфографическая ошибка или ошибка корпуса. ключи JSON чувствительны к регистру, поэтому $.userId не будет соответствовать a userID поле, а конечное пространство или опечатка в имени ключа не производят того же молчащего ничего. Поскольку тестер показывает вам документ прямо рядом с выражением, их быстро обнаружить.
Третий, как описано выше, является несоответствием типа фильтра, где числовое сравнение выполняется против строкового значения или наоборот. четвертый предполагает, что ключ существует на каждом элементе, когда он существует только на некоторых. Рекурсивный спуск и фильтры существования являются обычными средствами. В каждом случае исправление происходит от наблюдения за тем, к каким узлам касается выражение, для чего именно и предназначен тестер.
Если вы собираете через стек так, как я, перемещаясь между Laravel API, входной частью React и случайным сценарием оболочки, JSONPath отображается во всех трех, а браузерный тестер, который никогда не загружает ваши данные, является инструментом, который я держу ближе всего. Я написал о том, как подобные утилиты вписываются в более широкий комплект в Набор инструментов для веб-разработчиков, и аргументы в пользу сохранения такого рода работы со стороны клиента находятся в силе Конфиденциальность данных в онлайн-инстру гид.
Как это согласуется с остальной частью моего рабочего процесса JSON?
Тестер JSONPath редко бывает единственным открытым инструментом. Когда JSON, к которому я обращаюсь, прибыл с миниатюрным отступом или с непоследовательным отступом, я пропускаю его через Форматтер JSON сначала, чтобы я мог прочитать структуру, пока я пишу выражение Форматировщик и тестер вместе, как я перехожу от нечитаемого ответа API к рабочему запросу.
Как только я узнаю, какие поля меня волнуют, следующим шагом часто будет их изменение. Если мне нужно отправить выбранные значения в электронную таблицу или файл среды, JSON Флаттенер превращает вложенную структуру в точечные клавиши, а синтаксис ее пути достаточно близок к JSONPath, чтобы они усиливали друг друга. Если я создаю тип данных в TypeScript, то json в машинописный конвертер генерирует интерфейс, и если мне нужно проверить форму, а не просто прочитать ее, Генератор схемы JSON создает схему, к которой я могу добавить ограничения. JSONPath - это этап исследования; эти инструменты - то, что я делаю с тем, что нахожу.
Точку конфиденциальности стоит повторить, потому что JSONPath работа так часто происходит против конфиденциальных данных. API ответы несут токены, записи пользователей, и внутренние идентификаторы, и вставить их в серверный инструмент означает доверять кому-то еще's logs.Поскольку tester Toolz.dev анализирует и оценивает полностью в вашем браузере, ничто из этого не покидает вашу машину, и инструмент продолжает работать с сетью отключено. в этом разница между инструментом, который вы можете использовать на промежуточной полезной нагрузке, и инструментом, который вы можете использовать на реальной вещи.
Часто задаваемые вопросы
Для чего используется JSONPath?
JSONPath используется для выбора и извлечения частей документа JSON с одним выражением. Это язык запросов в инструментах тестирования API, форматировании вывода Kubernetes, облачных сервисах, таких как функции AWS Step, и многих платформах с низким кодом, где кому-то нужно извлечь поле или отфильтровать массив из полезной нагрузки JSON без записи процедурного кода.
Как выбрать каждый элемент массива в JSONPath?
Используйте подстановочный знак, так что $.items[*] возвращает каждый элемент массива элементов и $.items[*].id возвращает идентификатор каждого. вы также можете выбрать один элемент по индексу с $.items[0], последний элемент с отрицательным индексом $.items[-1], набор с профсоюзом типа $.items[0,2], или диапазон с ломтиком типа $.items[1:3], йо-
Что означает двойная точка в JSONPath?
Двойная точка - это рекурсивный спуск, который ищет на любой глубине. $..author находит каждый авторский ключ в любом месте документа, независимо от того, насколько глубоко он вложен, и $..* возвращает каждое значение на каждом уровне Это самый быстрый способ вытащить поле из документа, точную структуру которого вы не знаете заранее.
Как работают выражения фильтров в JSONPath?
Фильтр [?(...)] сохраняет только те элементы, для которых условие истинно, с @ ссылаясь на текущий элемент Например $.book[?(@.price < 10)] возвращает книги дешевле десяти, и можно совместить условия с && а ||, например [?(@.price < 10 && @.category == "fiction")]. Вы также можете проверить наличие поля и #39;s [?(@.isbn)], йо-
Почему мое выражение JSONPath ничего не возвращает?
Две наиболее распространенные причины - структурное несоответствие и несоответствие типов. проверьте, что каждый ключ существует и пишется с точной оболочкой, и что вы использовали подстановочный знак, где данные представляют собой массив, а не объект. В фильтрах помните, что & quot;12& quot; и 12 - это разные значения, поэтому сравните поле строки с цитируемым значением, а числовое поле - с чистым числом.
В чем разница между JSONPath и JSON Pointer?
Указатель JSON обращается к одному точному местоположению, например /store/book/0/title, и всегда возвращает одно значение.JSONPath - это язык запросов, где одно выражение может совпадать со многими узлами одновременно через подстановочные знаки, рекурсивное снижение и фильтры. Используйте указатель для ссылки на одно фиксированное поле, а JSONPath - для выбора набора полей или фильтрации коллекции.
Могу ли я увидеть путь каждого матча, а не только ценность?
Да. Переключите режим вывода на пути, чтобы получить нормализованное местоположение каждого совпадения, или записи, чтобы получить путь и значение вместе. Видеть реальные пути - это самый быстрый способ уточнить выражение, пока оно не выберет именно те узлы, которые вы намеревались, что особенно полезно при рекурсивном спуске.
Загружается ли мой JSON, когда я использую тестер?
Нет. документ анализируется, и выражение оценивается в вашем браузере с помощью JavaScript, поэтому ничего не передается, не регистрируется и не сохраняется. Вы можете подтвердить это, просмотрев вкладку сети во время выполнения запроса или отключившись от Интернета, потому что тестер продолжает работать в автономном режиме после загрузки страницы.
Попробуйте это на своих данных бесплатно Тестер JSONPath. Он полностью оценивает подстановочные знаки, рекурсивное снижение, фрагменты, объединения и выражения фильтров в вашем браузере, ничего не загружая.



