Bei der Suche nach Elementen in komplexen JSON-Arrays und -Hashes wie folgt:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Gibt es eine Abfragesprache, mit der ich einen Artikel finden kann in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
quelle
quelle
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
die Ihr JSON-Objekt enthält, würden Sie schreiben:jsel(data).select("//*[@id=3]")
und es würde das Objekt mit dem ID-Schlüssel mit 3 zurückgeben.Antworten:
Ja, es heißt JSONPath . Die Quelle ist jetzt auf GitHub .
Es ist auch in DOJO integriert .
quelle
Ich denke, JSONQuery ist eine Obermenge von JSONPath und ersetzt sie daher im Dojo . Dann gibt es noch RQL .
Aus der Dojo-Dokumentation:
JSONselect hat eine andere Sichtweise auf die Frage (CSS-Selektor-ähnlich statt XPath) und verfügt über eine JavaScript-Implementierung .
quelle
Andere mir bekannte Alternativen sind
HTH.
quelle
Um einige der aktuellen Optionen zum Durchlaufen / Filtern von JSON-Daten zusammenzufassen und einige Syntaxbeispiele bereitzustellen ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (mehr von CSS-Selektoren inspiriert)
.automobiles .maker:val("Honda") .model
JSONPath (mehr von XPath inspiriert)
$.automobiles[?(@.maker='Honda')].model
Ich denke, JSPath sieht am besten aus, also werde ich versuchen, es in meine AngularJS + CakePHP-App zu integrieren.
(Ich habe diese Antwort ursprünglich in einem anderen Thread gepostet , dachte aber, dass sie auch hier nützlich wäre.)
quelle
Versuchen Sie, JSPath zu verwenden
JSPath ist eine domänenspezifische Sprache (DSL), mit der Sie in Ihren JSON-Dokumenten navigieren und Daten finden können. Mit JSPath können Sie JSON-Elemente auswählen, um die darin enthaltenen Daten abzurufen.
JSPath für JSON wie ein XPath für XML.
Es ist sowohl für Node.js als auch für moderne Browser stark optimiert.
quelle
XQuery kann zum Abfragen von JSON verwendet werden, sofern der Prozessor JSON-Unterstützung bietet. Dies ist ein einfaches Beispiel, wie BaseX verwendet werden kann, um Objekte mit "id" = 1 zu finden:
quelle
jq definiert eine J SON q uery-Sprache, die JSONPath sehr ähnlich ist - siehe https://github.com/stedolan/jq/wiki/For-JSONPath-users
Ich gehe davon aus, dass dies bedeutet: Finden Sie alle JSON-Objekte unter dem angegebenen Schlüssel mit der ID == 3, unabhängig davon, wo sich das Objekt befindet. Eine entsprechende jq-Abfrage wäre:
wo "|" ist der Pipe-Operator (wie in Befehls-Shell-Pipes) und wobei das Segment ".. | Objekte" "egal wo sich das Objekt befindet" entspricht.
Die Grundlagen von jq sind weitgehend offensichtlich oder intuitiv oder zumindest recht einfach, und der größte Teil des Restes ist leicht zu erlernen, wenn Sie mit Command-Shell-Pipes überhaupt vertraut sind. Die jq- FAQ enthält Hinweise auf Tutorials und dergleichen.
jq ist auch insofern wie SQL, als es CRUD-Operationen unterstützt, obwohl der jq-Prozessor seine Eingabe niemals überschreibt. jq kann auch Streams von JSON-Entitäten verarbeiten.
Zwei weitere Kriterien, die Sie bei der Bewertung einer JSON-orientierten Abfragesprache berücksichtigen sollten, sind:
quelle
Defiant.js sieht auch ziemlich cool aus, hier ein einfaches Beispiel:
quelle
Json Pointer scheint auch zunehmend Unterstützung zu bekommen.
quelle
Jsel ist großartig und basiert auf einer echten XPath-Engine. Sie können XPath-Ausdrücke erstellen, um alle Arten von JavaScript-Daten zu finden, nicht nur Objekte (auch Zeichenfolgen).
Sie können benutzerdefinierte Schemas und Zuordnungen erstellen, um die vollständige Kontrolle darüber zu erhalten, wie Ihre Daten von der XPath-Engine ausgeführt werden können. Mit einem Schema können Sie definieren, wie Elemente, untergeordnete Elemente, Attribute und Knotenwerte in Ihren Daten definiert werden. Dann können Sie Ihre eigenen Ausdrücke erstellen.
Wenn Sie eine Variable namens aufgerufen haben,
data
die den JSON aus der Frage enthält, können Sie mit jsel schreiben:Dies gibt jeden Knoten mit einem
id
Attribut von 3 zurück. Ein Attribut ist ein beliebiger primitiver Wert (Zeichenfolge, Nummer, Datum, Regex) innerhalb eines Objekts.quelle
ObjectPath ist eine Abfragesprache, die XPath oder JSONPath ähnelt, jedoch dank eingebetteter arithmetischer Berechnungen, Vergleichsmechanismen und integrierter Funktionen viel leistungsfähiger ist. Siehe die Syntax:
Finden Sie im Shop alle Schuhe von roter Farbe und Preis unter 50
$ .. Schuhe. * [Farbe ist "rot" und Preis <50]
quelle
@Naftule - Mit "defiant.js" ist es möglich, eine JSON-Struktur mit XPath-Ausdrücken abzufragen. Schauen Sie sich diesen Evaluator an, um eine Vorstellung davon zu bekommen, wie es funktioniert:
http://www.defiantjs.com/#xpath_evaluator
Im Gegensatz zu JSONPath bietet "defiant.js" die vollständige Unterstützung der Abfragesyntax - von XPath in JSON-Strukturen.
Den Quellcode von defiant.js finden Sie hier:
https://github.com/hbi99/defiant.js
quelle
JMESPath scheint heutzutage (ab 2020) sehr beliebt zu sein und behebt eine Reihe von Problemen mit JSONPath. Es ist für viele Sprachen verfügbar.
quelle
Wenn Sie wie ich sind und nur pfadbasierte Suchvorgänge durchführen möchten, sich aber nicht für echte XPath interessieren,
_.get()
kann lodash's funktionieren. Beispiel aus lodash docs:quelle
Probieren Sie dies aus - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Es ist eine sehr einfache Implementierung in einer ähnlichen Zeile von xpath für xml. Es sind Namen wie jpath.
quelle