První dotaz
{
"cislo": "2026-117",
"zaplaceno": true,
"sleva": null,
"zakaznik": {
"jmeno": "Jana Nováková",
"email": "jana@example.cz"
},
"polozky": [
{ "nazev": "Hrnek", "mnozstvi": 2, "cena": 199.5 },
{ "nazev": "Podtácek", "mnozstvi": 1, "cena": 49 }
]
} Výsledek obsahuje hodnoty "Hrnek" a "Podtácek". Kořen značí $, aktuální uzel uvnitř filtru @. Dotaz vrací seznam uzlů: žádný, jeden nebo více. JSONPath dokument nemění.
Výběry a filtry
| Výraz | Význam | Nástroj |
|---|---|---|
| $.zakaznik.jmeno | jméno zákazníka | Vyzkoušet |
| $.polozky[*].nazev | názvy všech položek | Vyzkoušet |
| $.polozky[0].cena | cena první položky | Vyzkoušet |
| $.polozky[-1].nazev | poslední položka | Vyzkoušet |
| $.polozky[0:1].nazev | řez bez koncového indexu | Vyzkoušet |
| $.polozky[?@.cena >= 100].nazev | názvy položek od 100 Kč | Vyzkoušet |
| $..cena | ceny v libovolné hloubce | Vyzkoušet |
Pro názvy s tečkou použij hranaté závorky, například $['a.b']. Indexy pole začínají nulou; záporný index počítá od konce. Řez [0:2] nezahrnuje koncovou pozici.
Filtr $.polozky[?@.cena >= 100] vybere položky podle ceny. Test @.cena uvnitř filtru kontroluje existenci výsledku, nikoli JavaScriptovou pravdivost hodnoty. Existující null se proto liší od chybějící vlastnosti.
Selektory, filtry a funkce JSONPath vedle XPath a JSON Pointer najdeš v taháku XML a JSON.
Standard a knihovní dialekty
RFC 9535 vyšlo v únoru 2024. Standardní filtry nejsou libovolné výrazy JavaScriptu. Zápisy s eval, knihovní operátory nebo skriptové indexy ze starších implementací nejsou automaticky přenositelné. Při výměně knihovny spusť původní dotazy nad stejnými daty.
RFC definuje také funkce length, count, match, search a value. U členů objektu nespoléhej na pořadí výsledků. Opakovaný výběr stejného uzlu může vytvořit opakované výsledky.
Časté chyby a doporučení
- Prázdný výsledek není totéž co uzel s hodnotou null.
- Wildcard vybírá přímé potomky; pro rekurzivní průchod existuje
... - Neupravuj citlivá data podle pozice v neověřeném seznamu výsledků.
- Omez velikost vstupu, složitost dotazu a počet výsledků.
Pro jednoznačnou adresu použij JSON Pointer, pro změny JSON Patch. Přehled dalších nástrojů najdeš v srovnání.
Dotazy nad stejným vstupem a očekávané výsledky
{"knihy":[{"id":"k1","cena":199,"skladem":true},{"id":"k2","cena":49,"skladem":false},{"id":"k3","cena":null}],"a.b":"tečka"} $.knihy[0].id → ["k1"]
$.knihy[-1].id → ["k3"]
$.knihy[0:2].id → ["k1","k2"]
$.knihy[?@.cena >= 100].id → ["k1"]
$.knihy[?@.skladem].id → ["k1","k2"]
$.knihy[?@.skladem == true].id → ["k1"]
$['a.b'] → ["tečka"] Existence skladem vybere i false. Porovnání s true vybere jen první knihu. Pole výsledků výše je názorný seznam hodnot; některé knihovny vracejí navíc cesty nebo uzly. Hodnota null u ceny není chybějící vlastnost. Index mimo rozsah poskytne prázdný výběr, nikoli pole s null.
Filtry nepoužívej jako JavaScript: standardní výraz pracuje podle RFC 9535. Pro atributy se speciálními znaky preferuj závorkový selektor. Když dotaz vrátí nic, nejdřív ověř skutečnou strukturu ve stromovém prohlížeči a zkoušej kratší cestu.