JSONPath vs JSON Pointer vs JSON Patch

JSONPath hledá, Pointer adresuje a Patch mění. jq a JMESPath jsou další dotazovací jazyky s vlastní gramatikou; jejich výrazy nelze jednoduše zaměňovat.

Autor: Aktualizováno

Který nástroj použít

TechnologieÚčelPříkladDefinice
JSONPathvýběr nuly až mnoha uzlů$.polozky[*].nazevRFC 9535
JSON Pointerjedna adresa/polozky/0/nazevRFC 6901
JSON Patchposloupnost změnop + path + value / fromRFC 6902
Merge Patchaktualizace podle vzoruobjekt; null odstraní členRFC 7396
jqvýběr i transformace.polozky[] | .nazevjazyk projektu jq
JMESPathdotaz a projekcepolozky[*].nazevspecifikace JMESPath

Potřebuješ-li všechny ceny nad limitem, použij JSONPath. Pro přesné místo chyby nebo cíl změny se hodí Pointer. Pro klientský požadavek na změnu dokumentu zvol Patch nebo Merge Patch podle dokumentace API.

Výběr a změna nejsou stejná operace

Vyber názvy dražších položek
$.polozky[?@.cena >= 100].nazev
Adresuj cenu první položky
/polozky/0/cena
Nahraď cenu první položky
[{"op":"replace","path":"/polozky/0/cena","value":149}]

JSONPath není zárukou jedné adresy. Pointer s indexem může po změně pořadí označovat jinou položku. U obchodních operací používej stabilní ID a na serveru ověř očekávaný stav.

jq a JMESPath

Příkazová řádka jq
jq '.polozky[] | select(.cena >= 100) | .nazev' objednavka.json

jq je programovací filtr pro čtení, výpočty a tvorbu nových JSON struktur. JMESPath umožňuje projekce a konstrukci výsledků a používají ho také některá cloudová CLI. Nejsou to alternativní zápisy téhož RFC.

Pravidla a funkce ověřuj v manuálu jq a specifikaci JMESPath. Výraz polozky[*].nazev z JMESPath není standardní JSONPath, který vyžaduje kořen $.

Kam pokračovat

Všechny kapitoly sekce

Vyber si téma podle toho, co potřebuješ vyřešit. Seznam obsahuje i kapitoly, které se nevejdou do hlavního menu.

  • JSONPath JSONPath selektory, filtry, pole, objekty a rozdíly standardu RFC 9535 proti knihovním dialektům.
  • JSON Pointer JSON Pointer podle RFC 6901: lomítka, escapování ~0 a ~1, indexy polí a URI fragmenty.
  • JSON Patch Operace add, remove, replace, move, copy a test; atomické změny, JSON Pointer cesty a rozdíly Merge Patch.

Tři postupy nad stejnými daty

Vstup pro předchozí dotazy
{"polozky":[{"id":"p1","nazev":"Hrnek","cena":199},{"id":"p2","nazev":"Podtácek","cena":49}]}

JSONPath z předchozí sekce vybere seznam s názvem Hrnek. Pointer /polozky/0/cena označí jednu hodnotu 199. JSON Patch s replace změní tuto cenu na 149; ostatní údaje zachová. Dotaz tedy odpovídá na otázku „které položky vybrat“, cesta říká „kde hodnota leží“ a patch předepisuje „co změnit“.

Po vložení nové položky na začátek pole bude index 0 patřit jiné položce. Proto pro změnu konkrétního zboží ověř také jeho id a aktuální stav dokumentu. Cesta není trvalý identifikátor záznamu. Přesná pravidla změn popisuje RFC 6902.

jq: výsledky shromážděné do JSON pole
jq -c '[.polozky[] | select(.cena >= 100) | .nazev]' objednavka.json

Ulož vstup jako objednavka.json. Příkaz vypíše ["Hrnek"]. Hranaté závorky shromáždí vybrané hodnoty do jednoho pole; bez nich jq vypisuje výsledky postupně. Odpovídající JMESPath dotaz je polozky[?cena >= `100`].nazev. Jejich pravidla popisují jq a JMESPath.