ToolDeck

Tester JSONPath

Testuj wyrażenia JSONPath na danych JSON i przeglądaj pasujące wyniki

Wypróbuj przykład

Dane JSON

Wyniki

Działa lokalnie · Bezpieczne do wklejania sekretów
Wyniki pojawią się tutaj…

Czym jest JSONPath?

JSONPath to język zapytań służący do wyodrębniania wartości z dokumentów JSON. Pierwotnie zaproponowany przez Stefana Goessnera w 2007 roku jako odpowiednik XPath dla XML, JSONPath pozwala pisać wyrażenia takie jak $.store.book[*].author, aby wybrać wszystkie pola autora z tablicy książek bez pisania pętli czy ręcznego kodu przeszukiwania. Język ten został ustandaryzowany w lutym 2024 roku jako RFC 9535, opublikowany przez IETF.

Wyrażenie JSONPath zawsze zaczyna się od $ reprezentującego korzeń dokumentu. Od niego łańcuchowane są selektory: notacja z kropką dla kluczy obiektów, notacja z nawiasami dla indeksów tablic, symbole wieloznaczne dla wszystkich dzieci oraz operator rekurencyjnego przeszukiwania (..) do przeszukiwania każdego poziomu zagnieżdżenia. Wyrażenia filtrujące, takie jak [?(@.price < 10)], umożliwiają wybór elementów na podstawie warunków ocenianych względem ich wartości.

JSONPath jest używany w narzędziach do testowania API takich jak Postman, platformach obserwowalności takich jak Datadog i Splunk, silnikach przepływów pracy takich jak Apache NiFi oraz bibliotekach programistycznych w JavaScript, Python, Go, Java i C#. Testowanie wyrażeń na rzeczywistych danych przed ich osadzeniem w kodzie lub plikach konfiguracyjnych zapobiega cichym błędom, gdy struktura JSON nie odpowiada założeniom.

Dlaczego warto używać tego testera JSONPath?

Pisanie wyrażeń JSONPath ręcznie jest podatne na błędy. Brakująca kropka, zły typ nawiasu lub nieprawidłowa składnia filtra mogą zwracać puste wyniki bez żadnego komunikatu o błędzie. To narzędzie daje natychmiastową wizualną informację zwrotną o tym, co pasuje do Twojego wyrażenia.

Natychmiastowe wyniki
Wklej JSON, wpisz wyrażenie i obserwuj aktualizację pasujących wartości w czasie rzeczywistym. Nie musisz uruchamiać skryptu ani przeładowywać strony, aby sprawdzić zapytanie.
🔒
Prywatność przede wszystkim
Całe przetwarzanie odbywa się w Twojej przeglądarce. Dane JSON nigdy nie opuszczają Twojego urządzenia, więc możesz bezpiecznie testować wyrażenia na produkcyjnych odpowiedziach API lub plikach konfiguracyjnych zawierających dane uwierzytelniające.
📋
Kopiuj wyniki bezpośrednio
Skopiuj dopasowane dane wyjściowe jako JSON jednym kliknięciem. Wklej je do asercji testowych, dokumentacji lub przykładów odpowiedzi API bez konieczności ponownego formatowania.
🛠️
Bez konfiguracji
Nie trzeba instalować pakietów npm ani tworzyć wirtualnych środowisk Python. Otwórz stronę, wklej dane i zacznij zapytania. Działa na każdym urządzeniu z przeglądarką.

Przypadki użycia JSONPath

Programowanie frontendowe
Wyodrębnij dokładnie te zagnieżdżone wartości, których potrzebujesz z odpowiedzi API, zanim podłączysz je do stanu React lub właściwości obliczeniowych Vue. Przetestuj wyrażenia ścieżki na rzeczywistym payloadzie API.
Testowanie backendowych API
Postman i REST-assured używają JSONPath do asercji treści odpowiedzi. Zbuduj i zweryfikuj wyrażenia asercji tutaj, zanim skopiujesz je do skryptów testowych, redukując cykle debugowania.
Konfiguracja DevOps
Niestandardowe definicje zasobów Kubernetes, AWS Step Functions i źródła danych Terraform akceptują wyrażenia JSONPath do wyodrębniania wartości z wyjść JSON. Zwaliduj ścieżkę przed wdrożeniem.
Automatyzacja testów QA
Pisz asercje oparte na JSONPath dla testów kontraktowych i integracyjnych. Sprawdź, czy wyrażenia poprawnie dopasowują oczekiwane wartości, gdy struktura JSON zawiera pola opcjonalne lub nullable.
Ekstrakcja w potokach danych
Apache NiFi, Logstash i niestandardowe skrypty ETL używają JSONPath do wyodrębniania pól z półstrukturalnych danych logów i strumieni zdarzeń. Testuj wyrażenia na przykładowych payloadach przed wdrożeniem potoku.
Nauka i eksperymenty
Studenci i deweloperzy nowi w JSONPath mogą wypróbować różne wyrażenia na przykładowym JSON, aby zrozumieć, jak działają symbole wieloznaczne, rekurencyjne przeszukiwanie i filtry bez lokalnego środowiska.

Informacje o składni JSONPath

RFC 9535 definiuje standardową składnię JSONPath. Poniższa tabela obejmuje operatory, które będziesz używać w większości zapytań. Wszystkie wyrażenia zaczynają się od $ (węzeł główny) i łączą jeden lub więcej selektorów do nawigacji po strukturze dokumentu.

OperatorOpisPrzykład
$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 i XPath rozwiązują ten sam problem (zapytania do danych strukturalnych) dla różnych formatów i przypadków użycia. JSONPath celuje w JSON i jest dostępny jako biblioteka w większości języków. jq to samodzielne narzędzie CLI z własnym językiem filtrów Turinga. XPath operuje na XML i jest częścią stosu specyfikacji W3C.

FunkcjaJSONPathjqXPath
Format danychJSONJSONXML
Dostęp do pierwszego elementu$.store.book[0].store.book[0]/store/book[1]
Rekurencyjne przeszukiwanie$..price.. | .price?//price
Wyrażenie filtrujące[?(@.price<10)]select(.price < 10)[price<10]
SpecyfikacjaRFC 9535stedolan.github.ioW3C XPath 3.1

Przykłady kodu

Jak ewaluować wyrażenia JSONPath w popularnych językach i narzędziach. Każdy przykład używa tej samej struktury JSON księgarni dla porównania.

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}

Często zadawane pytania

Jaka jest różnica między JSONPath a jq?
JSONPath to język zapytań zaprojektowany do osadzania w aplikacjach jako biblioteka. Zwraca pasujące wartości z dokumentu JSON za pomocą wyrażeń ścieżki. jq to samodzielne narzędzie wiersza poleceń z pełnym językiem programowania do transformacji JSON, w tym warunkami, funkcjami i interpolacją łańcuchów. Używaj JSONPath, gdy potrzebujesz zapytania osadzonego w kodzie lub narzędziu takim jak Postman. Używaj jq do doraźnej transformacji danych w wierszu poleceń.
Czy JSONPath jest oficjalnym standardem?
Tak. IETF opublikował RFC 9535 ("JSONPath: Query Expressions for JSON") w lutym 2024 roku. Wcześniej JSONPath istniał tylko jako nieformalna specyfikacja Stefana Goessnera z 2007 roku, co prowadziło do niespójności między implementacjami. RFC 9535 definiuje składnię, semantykę i format normalizacji dla interoperacyjności.
Jak działa operator rekurencyjnego przeszukiwania (..) w JSONPath?
Operator rekurencyjnego przeszukiwania (..) przeszukuje każdy poziom dokumentu JSON w poszukiwaniu klucza, który po nim następuje. Na przykład $..price zwraca wszystkie wartości powiązane z kluczem "price" niezależnie od głębokości zagnieżdżenia. Jest to odpowiednik przeszukiwania w głąb, które zbiera pasujące węzły. Pamiętaj, że na dużych dokumentach rekurencyjne przeszukiwanie może zwracać wiele wyników i być wolniejsze niż bezpośrednia ścieżka.
Czy JSONPath może modyfikować dane JSON?
Nie. JSONPath to język zapytań tylko do odczytu. Wybiera i zwraca wartości, ale nie może wstawiać, aktualizować ani usuwać węzłów. Aby modyfikować JSON na podstawie wyrażenia JSONPath, należy użyć funkcji manipulacji JSON dostępnych w języku programowania po wykonaniu zapytania. Niektóre biblioteki, takie jak jsonpath-ng w Pythonie, udostępniają metodę set() na obiektach dopasowań, ale jest to rozszerzenie biblioteki, a nie część specyfikacji JSONPath.
Co oznacza symbol @ w wyrażeniach filtrujących JSONPath?
Symbol @ odnosi się do bieżącego węzła ocenianego w wyrażeniu filtrującym. W $.store.book[?(@.price < 10)] filtr iteruje po każdym elemencie tablicy book, a @ reprezentuje kolejno każdy obiekt książki. @.price uzyskuje dostęp do pola price bieżącej książki. Bez @, filtr nie wiedziałby, właściwości którego węzła sprawdzić.
Jak obsługiwać klucze ze znakami specjalnymi lub spacjami w JSONPath?
Użyj notacji z nawiasami i cudzysłowami: $['store']['book title']. Notacja z nawiasami działa dla dowolnego klucza, w tym tych z kropkami, spacjami lub znakami Unicode. Notacja z kropką ($.store.key) działa tylko dla kluczy będących prawidłowymi identyfikatorami (litery, cyfry, podkreślenia). RFC 9535 wymaga, aby implementacje obsługiwały zarówno notację z pojedynczymi, jak i podwójnymi cudzysłowami w nawiasach.
Dlaczego moje wyrażenie JSONPath zwraca puste wyniki?
Najczęstsze przyczyny to: literówka w nazwie klucza (JSONPath rozróżnia wielkość liter), użycie notacji z kropką dla klucza zawierającego znaki specjalne, brak symbolu $ na początku lub zakładanie, że wartość jest tablicą, gdy jest pojedynczym obiektem. Wklej JSON do narzędzia testującego i najpierw spróbuj prostszych podwyrażeń (np. $.store), aby sprawdzić, czy każdy segment ścieżki rozwiązuje się poprawnie przed dodaniem kolejnych selektorów.