JSONPath: dotazy podle RFC 9535

JSONPath vybírá hodnoty ze stromu JSON pomocí cest, indexů a filtrů. Standard RFC 9535 sjednocuje pravidla, která starší knihovny často vykládaly různě.

Autor: Aktualizováno

První dotaz

objednavka.json
{
  "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 }
  ]
}
Názvy všech položek
$.polozky[*].nazev

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ýrazVýznamNástroj
$.zakaznik.jmenojméno zákazníkaVyzkoušet
$.polozky[*].nazevnázvy všech položekVyzkoušet
$.polozky[0].cenacena první položkyVyzkoušet
$.polozky[-1].nazevposlední položkaVyzkoušet
$.polozky[0:1].nazevřez bez koncového indexuVyzkoušet
$.polozky[?@.cena >= 100].nazevnázvy položek od 100 KčVyzkoušet
$..cenaceny v libovolné hloubceVyzkouš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

Vstup pro JSONPath tester
{"knihy":[{"id":"k1","cena":199,"skladem":true},{"id":"k2","cena":49,"skladem":false},{"id":"k3","cena":null}],"a.b":"tečka"}
Zadej vždy jen výraz vlevo; vpravo jsou očekávané hodnoty
$.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.