JSON Toolkit

JSONPath или JSON Pointer

Главное: JSON Pointer — уникальный адрес, который можно хранить как ключ; JSONPath — язык запросов. Использование не того ломает обновления конфигурации или переизобретает сломанный JSONPath.

Средний~4 мин чтенияОпубликовано 2026-10-30Обновлено 2026-10-30
Где заканчивается JSONPath и начинается JSON Pointer

Главное: используйте JSON Pointer, когда нужно читать, записывать или хранить адрес одного узла (например, /server/cors/0), и JSONPath, когда нужно выбрать набор узлов по условию; любой сохраняемый путь должен быть Pointer, никогда не выражение.

Спросите, нужен вам один узел или набор.

В одной таблице

JSON Pointer JSONPath
Природа Уникальный адрес Выражение запроса
Синтаксис /a/b/0 $.a.b[0], $..price
Результат Ровно один узел или ни одного Ноль или более узлов
Хранится как ключ Да, строка и есть идентичность Нет, может совпасть со многими
Стандарт RFC 6901 RFC 9535 (завершён в 2024)

JSON Pointer

/server/host        -> "127.0.0.1"
/server/cors/0      -> "https://a.com"
/                   -> the whole document

Ключи, содержащие / или ~, экранируются: ~0 для ~, ~1 для /. Ценность — детерминизм: адрес является строкой, поэтому помещается в столбец базы данных, строку лога или ключ конфигурации. JSON Patch (RFC 6902) адресует каждую операцию именно так.

JSONPath

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

Ближе к SQL WHERE. Одно и то же выражение возвращает ноль, один или сто узлов в зависимости от данных.

Два режима отказа

Использование JSONPath как ключа конфигурации. Храните $.server.port, и однажды структура становится массивом; выражение теперь совпадает с несколькими портами, и логика обновления не может выбрать.

Использование Pointer для выбора. «Найти каждый узел, цена которого меньше 10» невозможно через pointer. Написание цикла самому означает построение частичного JSONPath.

Как реальные системы разделяют работу

  • Чтение конфигурации, обновления полей, патчи: Pointer, фиксированный и поддающийся аудиту
  • Исследование данных, массовое извлечение, отчётность: JSONPath, выразительность прежде всего
  • Всё сохраняемое: только Pointer, никогда не выражение

Вопросы и ответы

Как выбрать между JSON Pointer и JSONPath?

Спросите, нужен один узел или набор. Используйте JSON Pointer, чтобы читать или записывать один конкретный узел и хранить этот адрес как ключ, потому что pointer уникален, например /server/cors/0. Используйте JSONPath, чтобы выбирать узлы по условию, например $.store.book[?(@.price < 10)].

Почему выражение JSONPath нельзя использовать как ключ конфигурации?

Потому что выражение может совпасть с несколькими узлами. Храните $.server.port, и однажды структура становится массивом; выражение тогда совпадает с несколькими портами, и логика обновления не может решить, какой менять. Всё сохраняемое или проверяемое аудитом требует Pointer.

Может ли JSON Pointer фильтровать узлы по условию?

Нет. Pointer проходит только по фиксированному пути и не может знать, какие узлы существуют, поэтому выбор каждого узла с ценой меньше 10 невозможен. Написание этого цикла самому означает построение частичного JSONPath.

Дополнительное чтение