JSONPath-Abfrage-Leitfaden: Daten wie ein Profi extrahieren
JSONPath ist eine Abfragesprache für JSON, ähnlich wie XPath für XML funktioniert. Wenn Sie mit komplexen, tief verschachtelten JSON-Antworten von APIs arbeiten, können Sie mit JSONPath genau die Daten extrahieren, die Sie benötigen, ohne Schleifen und Bedingungen zu schreiben. Dieser Leitfaden behandelt die Syntax, Operatoren und praxisnahe Muster, die Sie brauchen.
Warum JSONPath?
Betrachten Sie eine typische API-Antwort mit verschachtelten Daten:
{
"store": {
"books": [
{ "title": "Clean Code", "author": "Robert Martin", "price": 32.99, "tags": ["programming", "best-practices"] },
{ "title": "Design Patterns", "author": "Gang of Four", "price": 44.99, "tags": ["programming", "architecture"] },
{ "title": "The Pragmatic Programmer", "author": "Hunt & Thomas", "price": 39.99, "tags": ["programming", "career"] }
],
"music": [
{ "title": "Kind of Blue", "artist": "Miles Davis", "price": 12.99 }
]
}
}
Um alle Buchtitel zu erhalten, könnten Sie eine Schleife schreiben — oder JSONPath verwenden: $.store.books[*].title
Grundlegende Syntax
| Ausdruck | Beschreibung |
|---|---|
$ | Wurzelobjekt |
. | Kind-Operator |
.. | Rekursiver Abstieg (alle Ebenen durchsuchen) |
[*] | Wildcard (alle Elemente) |
[n] | Array-Index (0-basiert) |
[n,m] | Mehrere Indizes |
[start:end:step] | Array-Slice |
[?()] | Filterausdruck |
@ | Aktuelles Element (in Filtern) |
Punkt-Notation vs. Klammer-Notation
Beide Notationen greifen auf Eigenschaften zu, aber die Klammer-Notation ist für Sonderzeichen erforderlich:
# Dot notation
$.store.books[0].title
# Bracket notation (equivalent)
$['store']['books'][0]['title']
# Required for keys with special characters
$['store']['price-range']
Array-Operationen
Indizierung
$.store.books[0] # First book
$.store.books[-1] # Last book
$.store.books[0,2] # First and third books
Slicing
$.store.books[0:2] # First two books (index 0 and 1)
$.store.books[1:] # All books except the first
$.store.books[:2] # First two books
$.store.books[::2] # Every other book
Wildcards
$.store.books[*].title # All book titles
$.store.* # All store collections (books, music)
$..title # All titles at any depth
$..price # All prices at any depth
Der Operator für rekursiven Abstieg (..) ist besonders leistungsfähig zum Extrahieren von Werten unabhängig von ihrer Position in der Hierarchie.
Filterausdrücke
Filter wählen Elemente basierend auf Bedingungen aus:
# Books cheaper than $40
$.store.books[?(@.price < 40)]
# Books by a specific author
$.store.books[?(@.author == 'Robert Martin')]
# Books with more than 2 tags
$.store.books[?(@.tags.length > 2)]
# Books that have a 'price' property
$.store.books[?(@.price)]
Filter kombinieren
# Books under $40 by programming tag
$.store.books[?(@.price < 40 && @.tags[0] == 'programming')]
Praxisbeispiele
Aus API-Antworten extrahieren
GitHub API — alle Repository-Namen abrufen:
$[*].name
Wetter-API — heutige Temperatur abrufen:
$.daily[0].temp.day
E-Commerce-API — alle Produktbilder abrufen:
$.products[*].images[0].url
Konfigurationsextraktion
Docker Compose — alle Servicenamen abrufen:
$.services.*~
Package.json — alle Abhängigkeitsnamen abrufen:
$.dependencies.*~
JSONPath vs. jq
JSONPath und jq sind beide JSON-Abfragetools, dienen aber unterschiedlichen Kontexten:
| Eigenschaft | JSONPath | jq |
|---|---|---|
| Umgebung | Bibliotheken, APIs | Kommandozeile |
| Syntax | XPath-inspiriert | Benutzerdefiniert funktional |
| Transformation | Nur Abfrage | Abfrage + Transformation |
| Standard | RFC 9535 | De-facto-Standard |
Für die Kommandozeilen-JSON-Verarbeitung ist jq leistungsfähiger. Für das Einbetten von Abfragen in Anwendungen oder die Verwendung in Web-Tools wird JSONPath breiter unterstützt.
Testen Sie JSONPath-Ausdrücke interaktiv mit unserem JSON Path Explorer. Fügen Sie Ihr JSON ein, schreiben Sie eine Abfrage und sehen Sie sofort Ergebnisse.
Implementierungsbeispiele
JavaScript (jsonpath-plus)
const { JSONPath } = require('jsonpath-plus');
const result = JSONPath({
path: '$.store.books[?(@.price < 40)].title',
json: data
});
// ["Clean Code", "The Pragmatic Programmer"]
Python (jsonpath-ng)
from jsonpath_ng import parse
expr = parse('$.store.books[*].title')
titles = [match.value for match in expr.find(data)]
RFC 9535: Der JSONPath-Standard
Im Februar 2024 wurde JSONPath offiziell als RFC 9535 standardisiert. Dies behebt historische Inkonsistenzen zwischen Implementierungen. Wichtige standardisierte Verhaltensweisen:
- Array-Indizes sind 0-basiert
- Filterausdrücke verwenden
@für das aktuelle Element - String-Vergleich ist case-sensitive
- Das Ergebnis ist immer ein Array von übereinstimmenden Werten
Wenn Sie eine JSONPath-Bibliothek wählen, bevorzugen Sie eine, die RFC 9535 unterstützt, für konsistentes Verhalten.
FAQ
Was ist der Unterschied zwischen JSONPath und JSON Pointer?
JSONPath ist eine Abfragesprache, die mehrere Werte mit Wildcards und Filtern abgleichen kann. JSON Pointer (RFC 6901) ist eine einfache Pfadsyntax, die genau einen Wert adressiert: /store/books/0/title. Verwenden Sie JSONPath, wenn Sie suchen oder filtern müssen; verwenden Sie JSON Pointer, wenn Sie den genauen Pfad kennen.
Kann JSONPath JSON-Daten ändern?
Standard-JSONPath ist schreibgeschützt — es extrahiert, aber ändert keine Daten. Einige Bibliotheken erweitern JSONPath um Set/Delete-Operationen, aber diese sind nicht standardisiert. Für Transformationen verwenden Sie jq (Kommandozeile) oder schreiben Sie Anwendungscode. Zum Anzeigen und Erkunden der JSON-Struktur hilft Ihnen unser JSON Formatter, die Daten vor dem Schreiben von Abfragen zu verstehen.
Verwandte Ressourcen
- JSON Path Explorer — JSONPath-Ausdrücke im Browser testen
- JSON-Formatierung: Best Practices — JSON für einfacheres Abfragen strukturieren
- JSON-Schema-Validierungsleitfaden — Die Struktur validieren, die Ihre JSONPath-Abfragen erwarten
🛠️ Jetzt ausprobieren: JSON Path — 100% kostenlos, alles wird in Ihrem Browser verarbeitet. Keine Daten hochgeladen.