Bei der Suche nach Elementen in komplexen JSON-Arrays und Hashes wie:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Gibt es eine Art Abfragesprache, mit der ich einen Artikel in [0].objects where id = 3
finden kann?
Ich denke, JSONQuery ist eine Obermenge von JSONPath und daher ersetzt es im Dojo . Dann gibt es noch RQL .
Aus der Dojo-Dokumentation:
JSONQuery ist eine erweiterte Version von JSONPath mit zusätzlichen Funktionen für Sicherheit, Benutzerfreundlichkeit und eine umfassende Datenabfrage Werkzeuge wie Filtern, rekursive Suche, Sortieren, Mapping, Bereich Auswahl und flexible Ausdrücke mit Vergleichen von Platzhalterzeichenfolgen und verschiedene Betreiber.
JSONselect hat einen anderen Standpunkt zu der Frage (CSS-Selector-Art statt XPath) und eine JavaScript-Implementierung .
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 schönsten 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 sein könnte.)
Andere Alternativen, die mir bekannt sind, sind
HTH.
Verwenden Sie JSPath .
JSPath ist eine domänenspezifische Sprache (DSL), mit der Sie in Ihren JSON-Dokumenten nach Daten suchen und suchen können. Mit JSPath können Sie Elemente von JSON 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.
XQuery kann zur Abfrage von JSON verwendet werden, vorausgesetzt, der Prozessor bietet JSON-Unterstützung an. Dies ist ein einfaches Beispiel, wie BaseX zum Suchen von Objekten mit "id" = 1 verwendet werden kann:
json:parse('[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]')//value[.//id = 1]
Defiant.js sieht auch ziemlich cool aus, hier ein einfaches Beispiel:
var obj = {
"car": [
{"id": 10, "color": "silver", "name": "Volvo"},
{"id": 11, "color": "red", "name": "Saab"},
{"id": 12, "color": "red", "name": "Peugeot"},
{"id": 13, "color": "yellow", "name": "Porsche"}
],
"bike": [
{"id": 20, "color": "black", "name": "Cannondale"},
{"id": 21, "color": "red", "name": "Shimano"}
]
},
search = JSON.search(obj, '//car[color="yellow"]/name');
console.log( search );
// ["Porsche"]
var reds = JSON.search(obj, '//*[color="red"]');
for (var i=0; i<reds.length; i++) {
console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano
Json Pointer scheint auch Unterstützung zu bekommen.
ObjectPath ist eine Abfragesprache, die XPath oder JSONPath ähnelt, jedoch dank eingebetteter Rechenrechen, Vergleichsmechanismen und integrierten Funktionen ..__ viel leistungsfähiger ist. Siehe die Syntax:
Finden Sie im Shop alle Schuhe in roter Farbe und Preis unter 50
$ .. Schuhe. * [Farbe ist "rot" und Preis <50]
Jsel ist fantastisch und basiert auf einer echten XPath-Engine. Damit können Sie XPath-Ausdrücke erstellen, um alle Arten von JavaScript-Daten zu finden, nicht nur Objekte (auch Zeichenfolgen).
Sie können benutzerdefinierte Schemata und Zuordnungen erstellen, um vollständige Kontrolle darüber zu erhalten, wie Ihre Daten von der XPath-Engine abgerufen werden können. Mit einem Schema können Sie definieren, wie Elemente, Kinder, Attribute und Knotenwerte in Ihren Daten definiert werden. Dann können Sie Ihre eigenen Ausdrücke erstellen.
Da Sie eine Variable namens data
hatten, die die JSON aus der Frage enthielt, könnten Sie mit jsel schreiben:
jsel(data).select("//*[@id=3]")
Dadurch wird jeder Knoten mit einem id
-Attribut von 3 zurückgegeben. Ein Attribut ist ein beliebiger Grundwert (String, Nummer, Datum, Regex) innerhalb eines Objekts.
Gibt es eine Art Abfragesprache ...
jq definiert eine J SON q uery Sprache, die JSONPath sehr ähnlich ist - siehe https://github.com/stedolan/jq/wiki/For-JSONPath -User
... mit welcher kann ich ein Objekt in [0] .Objekten finden, bei denen id = 3 ist?
Ich gehe davon aus, dass dies bedeutet: Suchen 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:
.[0].objects | .. | objects | select(.id==3)
wo "|" ist der Pipe-Operator (wie im Befehl Shell-Pipes) und das Segment ".. | objects" entspricht "egal wo sich das Objekt befindet".
Die Grundlagen von jq sind weitgehend offensichtlich oder intuitiv oder zumindest recht einfach, und der Rest lässt sich leicht aufgreifen, wenn Sie mit Kommando-Shell-Pipes vertraut sind. Das jq FAQ enthält Hinweise auf Tutorials und ähnliches.
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 Beurteilung einer JSON-orientierten Abfragesprache berücksichtigen sollten, sind:
@Naftule - Mit "defiant.js" ist es möglich, eine JSON-Struktur mit XPath-Ausdrücken abzufragen. Sehen Sie sich dieses Bewerter 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 für JSON-Strukturen.
Den Quellcode von defiant.js finden Sie hier:
https://github.com/hbi99/defiant.js
Wenn Sie wie ich sind und nur pfadbasierte Suchvorgänge durchführen möchten, sich aber kein echter XPath interessiert, kann lodash's _.get()
funktionieren. Beispiel aus lodash docs:
var object = { 'a': [{ 'b': { 'c': 3 } }] };
_.get(object, 'a[0].b.c');
// → 3
_.get(object, ['a', '0', 'b', 'c']);
// → 3
_.get(object, 'a.b.c', 'default');
// → 'default'
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.