ToolDeck

JSONPath Tester

Testujte výrazy JSONPath oproti datům JSON a zobrazte odpovídající výsledky

Zkusit příklad

Vstup JSON

Výsledky

Běží lokálně · Bezpečné pro vkládání tajných údajů
Výsledky se zobrazí zde…

Co je JSONPath?

JSONPath je dotazovací jazyk pro extrakci hodnot z dokumentů JSON. Původně ho navrhl Stefan Goessner v roce 2007 jako analogii k XPath pro XML. JSONPath umožňuje psát výrazy jako $.store.book[*].author a vybírat tak všechna pole author uvnitř pole book bez psaní smyček nebo ručního procházení kódem. Jazyk byl standardizován v únoru 2024 jako RFC 9535, vydaný organizací IETF.

Výraz JSONPath vždy začíná znakem $ reprezentujícím kořen dokumentu. Od něj lze řetězit selektory: tečková notace pro klíče objektu, závorková notace pro indexy pole, zástupné znaky pro všechny potomky a operátor rekurzivního sestupu (..) pro prohledávání každé úrovně vnoření. Výrazy filtru jako [?(@.price < 10)] umožňují vybírat prvky na základě podmínek vyhodnocených oproti jejich hodnotám.

JSONPath se používá v nástrojích pro testování API jako Postman, na observability platformách jako Datadog a Splunk, v workflow enginech jako Apache NiFi a v programovacích knihovnách pro JavaScript, Python, Go, Javu a C#. Testování výrazů oproti reálným datům před jejich vložením do kódu nebo konfiguračních souborů předchází tichým selháním, když struktura JSON neodpovídá předpokladům.

Proč používat tento JSONPath Tester?

Ruční psaní výrazů JSONPath je náchylné k chybám. Chybějící tečka, špatný typ závorek nebo nesprávná syntaxe filtru může vrátit prázdné výsledky bez chybové zprávy. Tento nástroj poskytuje okamžitou vizuální zpětnou vazbu o tom, co váš výraz odpovídá.

Okamžité výsledky
Vložte JSON, napište výraz a sledujte odpovídající hodnoty aktualizované v reálném čase. Není třeba spouštět skript ani znovu načítat stránku, abyste ověřili dotaz.
🔒
Soukromí na prvním místě
Veškeré vyhodnocování probíhá v prohlížeči. Vaše data JSON nikdy neopustí váš počítač, takže můžete bezpečně testovat výrazy oproti produkčním odpovědím API nebo konfiguračním souborům obsahujícím přihlašovací údaje.
📋
Přímé kopírování výsledků
Zkopírujte odpovídající výstup jako JSON jedním kliknutím. Vložte ho do testovacích tvrzení, dokumentace nebo příkladů odpovědí API bez nutnosti přeformátování.
🛠️
Bez nutnosti instalace
Žádné npm balíčky k instalaci, žádná Python virtuální prostředí k vytváření. Otevřete stránku, vložte data a začněte dotazovat. Funguje na jakémkoli zařízení s prohlížečem.

Případy použití JSONPath

Vývoj frontendu
Extrahujte přesné vnořené hodnoty, které potřebujete z odpovědí API, před jejich zapojením do stavu React nebo computed vlastností Vue. Nejprve otestujte výrazy cest oproti reálnému payloadu API.
Testování backendového API
Postman a REST-assured používají JSONPath k ověřování těl odpovědí. Sestavte a ověřte výrazy pro tvrzení zde před jejich zkopírováním do testovacích skriptů, čímž snížíte počet ladících cyklů.
Konfigurace DevOps
Vlastní definice zdrojů Kubernetes, AWS Step Functions a datové zdroje Terraformu přijímají výrazy JSONPath k extrakci hodnot z výstupů JSON. Ověřte cestu před nasazením.
Automatizace testování QA
Pište tvrzení na základě JSONPath pro kontraktní testy a integrační testy. Ověřte, že vaše výrazy správně odpovídají očekávaným hodnotám, když struktura JSON obsahuje volitelná nebo nulovatelná pole.
Extrakce v datových pipeline
Apache NiFi, Logstash a vlastní ETL skripty používají JSONPath k extrakci polí z polostrukturovaných dat protokolů a proudů událostí. Testujte výrazy oproti ukázkovým payloadům před nasazením pipeline.
Učení a experimentování
Studenti a vývojáři, kteří JSONPath teprve poznávají, mohou vyzkoušet různé výrazy oproti ukázkovému JSON a pochopit, jak fungují zástupné znaky, rekurzivní sestup a filtry bez nutnosti lokálního prostředí.

Přehled syntaxe JSONPath

RFC 9535 definuje standardní syntaxi JSONPath. Níže uvedená tabulka pokrývá operátory, které budete používat ve většině dotazů. Všechny výrazy začínají znakem $ (kořenový uzel) a řetězí jeden nebo více selektorů k procházení strukturou dokumentu.

OperátorPopisPříklad
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath vs jq vs XPath

JSONPath, jq a XPath řeší stejný problém (dotazování strukturovaných dat) pro různé formáty a případy použití. JSONPath je zaměřen na JSON a je dostupný jako knihovna ve většině jazyků. jq je samostatný nástroj CLI s vlastním Turingovsky úplným filtrovacím jazykem. XPath pracuje s XML a je součástí specifikačního zásobníku W3C.

VlastnostJSONPathjqXPath
Formát datJSONJSONXML
Přístup k prvnímu prvku$.store.book[0].store.book[0]/store/book[1]
Rekurzivní vyhledávání$..price.. | .price?//price
Výraz filtru[?(@.price<10)]select(.price < 10)[price<10]
SpecifikaceRFC 9535stedolan.github.ioW3C XPath 3.1

Příklady kódu

Jak vyhodnocovat výrazy JSONPath v oblíbených jazycích a nástrojích. Každý příklad používá stejnou strukturu JSON knihkupectví pro srovnání.

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

Často kladené otázky

Jaký je rozdíl mezi JSONPath a jq?
JSONPath je dotazovací jazyk navržený k vložení do aplikací jako knihovna. Vrací odpovídající hodnoty z dokumentu JSON pomocí výrazů cest. jq je samostatný nástroj příkazové řádky s plnohodnotným programovacím jazykem pro transformaci JSON, včetně podmínek, funkcí a interpolace řetězců. Používejte JSONPath, když potřebujete dotaz vložený v kódu nebo nástroji jako Postman. Používejte jq pro ad-hoc transformaci dat na příkazové řádce.
Je JSONPath oficiálním standardem?
Ano. IETF vydala RFC 9535 ("JSONPath: Query Expressions for JSON") v únoru 2024. Před tím existoval JSONPath pouze jako neformální specifikace Stefana Goessnera z roku 2007, což vedlo k nekonzistencím mezi implementacemi. RFC 9535 definuje syntaxi, sémantiku a normalizační formát pro interoperabilitu.
Jak funguje rekurzivní sestup (..) v JSONPath?
Operátor rekurzivního sestupu (..) prohledává každou úroveň dokumentu JSON hledaje klíč, který za ním následuje. Například $..price vrátí všechny hodnoty přidružené ke klíči "price" bez ohledu na hloubku jejich vnoření. Je ekvivalentní průchodu do hloubky (depth-first), který shromažďuje odpovídající uzly. Mějte na paměti, že u velkých dokumentů může rekurzivní sestup vrátit mnoho výsledků a může být pomalejší než přímá cesta.
Může JSONPath modifikovat data JSON?
Ne. JSONPath je dotazovací jazyk pouze pro čtení. Vybírá a vrací hodnoty, ale nemůže vkládat, aktualizovat ani mazat uzly. Chcete-li modifikovat JSON na základě výrazu JSONPath, musíte po dotazování použít funkce pro manipulaci s JSON ve svém programovacím jazyce. Některé knihovny jako jsonpath-ng v Pythonu poskytují metodu set() na objektech shody, ale to je rozšíření knihovny, nikoli součást specifikace JSONPath.
Co znamená symbol @ ve výrazech filtru JSONPath?
Symbol @ odkazuje na aktuálně vyhodnocovaný uzel ve výrazu filtru. Ve výrazu $.store.book[?(@.price < 10)] filtr iteruje přes každý prvek pole book a @ reprezentuje každý objekt book postupně. @.price přistupuje k poli price aktuální knihy. Bez @, by filtr nevěděl, vlastnosti kterého uzlu má kontrolovat.
Jak zacházet s klíči se speciálními znaky nebo mezerami v JSONPath?
Použijte závoukovou notaci s uvozovkami: $['store']['book title']. Závorková notace funguje pro jakýkoli klíč, včetně těch s tečkami, mezerami nebo znaky Unicode. Tečková notace ($.store.key) funguje pouze pro klíče, které jsou platnými identifikátory (písmena, číslice, podtržítka). RFC 9535 vyžaduje, aby implementace podporovaly závoukovou notaci s jednoduchými i dvojitými uvozovkami.
Proč můj výraz JSONPath vrací prázdné výsledky?
Nejčastější příčiny jsou: překlep v názvu klíče (JSONPath rozlišuje malá a velká písmena), použití tečkové notace pro klíč obsahující speciální znaky, chybějící kořenový symbol $ na začátku nebo předpoklad, že hodnota je pole, zatímco je to jediný objekt. Vložte JSON do testovacího nástroje a nejprve vyzkoušejte jednodušší dílčí výrazy (jako $.store), abyste ověřili, že každý segment cesty se správně vyhodnotí, než přidáte další selektory.