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