JSONPath czy JSON Pointer
Podsumowanie: JSON Pointer to unikalny adres, który można przechowywać jako klucz; JSONPath to język zapytań. Użycie niewłaściwego psuje aktualizacje konfiguracji albo odtwarza zepsuty JSONPath.

Najważniejsze: używaj JSON Pointer, gdy musisz czytać, zapisywać lub przechowywać adres jednego węzła (na przykład /server/cors/0), a JSONPath, gdy musisz wybrać zbiór węzłów po warunku; każda utrwalona ścieżka powinna być Pointerem, nigdy wyrażeniem.
Zapytaj, czy potrzebujesz jednego węzła, czy zbioru.
W jednej tabeli
| JSON Pointer | JSONPath | |
|---|---|---|
| Natura | Unikalny adres | Wyrażenie zapytania |
| Składnia | /a/b/0 |
$.a.b[0], $..price |
| Wynik | Dokładnie jeden węzeł albo żaden | Zero lub więcej węzłów |
| Można przechować jako klucz | Tak, łańcuch jest tożsamością | Nie, może pasować do wielu |
| Standard | RFC 6901 | RFC 9535 (sfinalizowane w 2024) |
JSON Pointer
/server/host -> "127.0.0.1"
/server/cors/0 -> "https://a.com"
/ -> the whole document
Klucze zawierające / lub ~ są escape'owane: ~0 dla ~, ~1 dla /. Wartością jest determinizm: adres jest łańcuchem, więc pasuje do kolumny bazy, linii logu lub klucza konfiguracji. JSON Patch (RFC 6902) adresuje tak każdą operację.
JSONPath
$.store.book[*].author
$..price
$.store.book[?(@.price < 10)]
Bardziej przypomina SQL WHERE. To samo wyrażenie zwraca zero, jeden lub sto węzłów w zależności od danych.
Dwa tryby porażki
Używanie JSONPath jako klucza konfiguracji. Zapisz $.server.port, a pewnego dnia struktura stanie się tablicą; wyrażenie pasuje wtedy do kilku portów i logika aktualizacji nie ma jak wybrać.
Używanie Pointera do selekcji. „Znajdź każdy węzeł, którego cena jest poniżej 10” jest niemożliwe ze wskaźnikiem. Pisanie pętli samodzielnie oznacza budowanie częściowego JSONPath.
Jak prawdziwe systemy dzielą pracę
- Odczyt konfiguracji, aktualizacje pól, patche: Pointer, stały i audytowalny
- Eksploracja danych, ekstrakcja zbiorcza, raportowanie: JSONPath, siła wyrazu przede wszystkim
- Cokolwiek utrwalanego: tylko Pointer, nigdy wyrażenie
FAQ
Jak wybrać między JSON Pointer a JSONPath?
Zapytaj, czy potrzebujesz jednego węzła, czy zbioru. Użyj JSON Pointer do czytania lub zapisu jednego konkretnego węzła i przechowania tego adresu jako klucza, bo wskaźnik jest unikalny, na przykład /server/cors/0. Użyj JSONPath do wybierania węzłów po warunku, na przykład $.store.book[?(@.price < 10)].
Dlaczego wyrażenia JSONPath nie można użyć jako klucza konfiguracji?
Bo wyrażenie może pasować do kilku węzłów. Zapisz $.server.port, a pewnego dnia struktura stanie się tablicą; wyrażenie pasuje wtedy do wielu portów i logika aktualizacji nie potrafi zdecydować, który zmienić. Cokolwiek utrwalonego lub audytowanego wymaga Pointera.
Czy JSON Pointer potrafi filtrować węzły po warunku?
Nie. Wskaźnik tylko przechodzi stałą ścieżkę i nie ma jak wiedzieć, które węzły istnieją, więc wybranie każdego węzła o cenie poniżej 10 jest niemożliwe. Pisanie tej pętli samodzielnie oznacza budowanie częściowego JSONPath.