Který nástroj použít
| Technologie | Účel | Příklad | Definice |
|---|---|---|---|
| JSONPath | výběr nuly až mnoha uzlů | $.polozky[*].nazev | RFC 9535 |
| JSON Pointer | jedna adresa | /polozky/0/nazev | RFC 6901 |
| JSON Patch | posloupnost změn | op + path + value / from | RFC 6902 |
| Merge Patch | aktualizace podle vzoru | objekt; null odstraní člen | RFC 7396 |
| jq | výběr i transformace | .polozky[] | .nazev | jazyk projektu jq |
| JMESPath | dotaz a projekce | polozky[*].nazev | specifikace 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
$.polozky[?@.cena >= 100].nazev /polozky/0/cena [{"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
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
- JSONPath pro filtry a výběry.
- JSON Pointer pro escapování cest.
- JSON Patch a Merge Patch pro operace a selhání.
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
{"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 -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.