Gibt es eine (ungefähr) SQL- oder XQuery-ähnliche Sprache zum Abfragen von JSON?
Ich denke an sehr kleine Datensätze, die sich gut für JSON eignen, wo es hilfreich wäre, einfach Fragen wie "Was sind alle Werte von X, wobei Y> 3 ist" zu beantworten oder die üblichen Operationen vom Typ SUM / COUNT auszuführen.
Als komplett erfundenes Beispiel so etwas:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0 (would equate to 7)
LIST(X) WHERE Y > 0 (would equate to [3,4])
Ich denke, dies würde sowohl clientseitig als auch serverseitig funktionieren, wobei die Ergebnisse in die entsprechende sprachspezifische Datenstruktur konvertiert werden (oder möglicherweise als JSON beibehalten werden).
Ein kurzes Googeln deutet darauf hin, dass die Leute darüber nachgedacht und einige Dinge implementiert haben ( JAQL ), aber es scheint noch keine Standardverwendung oder eine Reihe von Bibliotheken entstanden zu sein. Obwohl jede Funktion für sich genommen ziemlich trivial zu implementieren ist, möchte ich das Rad nicht neu erfinden, wenn jemand es bereits richtig gemacht hat.
Irgendwelche Vorschläge?
Bearbeiten: Dies kann in der Tat eine schlechte Idee sein oder JSON kann ein zu allgemeines Format für das sein, was ich denke. Der Grund für den Wunsch nach einer Abfragesprache, anstatt nur die Summierungs- / etc-Funktionen direkt nach Bedarf auszuführen, ist, dass ich hoffe, sie zu erstellen Die Abfragen basieren dynamisch auf Benutzereingaben. Ein bisschen wie das Argument, dass "wir kein SQL brauchen, wir können nur die Funktionen schreiben, die wir brauchen". Irgendwann gerät das entweder außer Kontrolle oder Sie schreiben Ihre eigene SQL-Version, während Sie sie immer weiter vorantreiben. (Okay, ich weiß, das ist ein bisschen albern, aber Sie haben die Idee ..)
quelle
Antworten:
Klar, wie wäre es mit:
Sie scheinen alle ein bisschen in Arbeit zu sein, arbeiten aber bis zu einem gewissen Grad. Sie ähneln auch konzeptionell XPath und XQuery. obwohl XML und JSON unterschiedliche konzeptionelle Modelle haben (hierarchisch vs. Objekt / Struktur).
EDIT Sep-2015: Tatsächlich gibt es jetzt den JSON Pointer- Standard, der eine sehr einfache und effiziente Durchquerung von JSON-Inhalten ermöglicht. Es ist nicht nur formal spezifiziert, sondern wird auch von vielen JSON-Bibliotheken unterstützt. Ich würde es also als wirklich nützlichen Standard bezeichnen, obwohl es aufgrund seiner begrenzten Ausdruckskraft per se als Abfragesprache betrachtet werden kann oder nicht.
quelle
Ich würde mein Projekt mit dem Namen jLinq empfehlen, an dem ich arbeite . Ich bin auf der Suche nach Feedback, daher würde ich gerne hören, was Sie denken.
Wenn Sie Abfragen schreiben können, die denen in LINQ ähneln ...
Es ist auch voll erweiterbar!
Die Dokumentation ist noch in Bearbeitung, aber Sie können sie immer noch online ausprobieren.
quelle
Update: XQuery 3.1 kann entweder XML oder JSON abfragen - oder beides zusammen. Und XPath 3.1 kann auch.
Die Liste wächst:
quelle
jmespath funktioniert wirklich ganz einfach und gut, http://jmespath.org/ Es wird von Amazon in der AWS-Befehlszeilenschnittstelle verwendet, daher muss es ziemlich stabil sein.
quelle
jmespath
für den--query
Parameter verwendet, aberjq
für die Befehlszeilen-Weiterleitung empfiehlt . docs.aws.amazon.com/cli/latest/userguide/…jq ist eine J SON q uery-Sprache, die hauptsächlich für die Befehlszeile gedacht ist, jedoch an eine Vielzahl von Programmiersprachen (Java, node.js, php, ...) gebunden ist und sogar über jq-web im Browser verfügbar ist .
Hier sind einige Abbildungen, die auf der ursprünglichen Frage basieren, die diesen JSON als Beispiel gegeben hat:
Die jq-Syntax erweitert die JSON-Syntax
Jeder JSON-Ausdruck ist ein gültiger jq-Ausdruck, und Ausdrücke wie
[1, (1+1)]
und {"a": (1 + 1)} `veranschaulichen, wie jq die JSON-Syntax erweitert.Ein nützlicheres Beispiel ist der Ausdruck jq:
die, angesichts der JSON Wert
{"a":1, "b":2, "c": 3}
, ausgewertet{"a":1, "b":2}
.quelle
Die integrierte
array.filter()
Methode macht die meisten dieser sogenannten Javascript-Abfragebibliotheken überflüssigSie können so viele Bedingungen in den Delegaten einfügen, wie Sie sich vorstellen können: einfacher Vergleich, Start mit usw. Ich habe nicht getestet, aber Sie könnten wahrscheinlich auch Filter verschachteln, um innere Sammlungen abzufragen.
quelle
array.filter()
ist Teil von JavaScript, nicht von JSON.Wenn Sie .NET verwenden, unterstützt Json.NET LINQ-Abfragen über JSON hinaus. Dieser Beitrag enthält einige Beispiele. Es unterstützt das Filtern, Zuordnen, Gruppieren usw.
quelle
ObjectPath ist eine einfache und leichtgewichtige Abfragesprache für JSON-Dokumente mit komplexer oder unbekannter Struktur. Es ähnelt XPath oder JSONPath, ist jedoch dank eingebetteter arithmetischer Berechnungen, Vergleichsmechanismen und integrierter Funktionen viel leistungsfähiger.
Die Python-Version ist ausgereift und wird in der Produktion verwendet. JS ist noch in der Beta.
Wahrscheinlich werden wir in naher Zukunft eine vollwertige Javascript-Version bereitstellen. Wir möchten es auch weiterentwickeln, damit es als einfachere Alternative zu Mongo-Abfragen dienen kann.
quelle
Eine andere Möglichkeit, dies zu betrachten, wäre die Verwendung von mongoDB. Sie können Ihren JSON in mongo speichern und ihn dann über die mongodb-Abfragesyntax abfragen.
quelle
OK, dieser Beitrag ist etwas alt, aber ... wenn Sie eine SQL-ähnliche Abfrage in nativem JSON (oder JS-Objekten) für JS-Objekte durchführen möchten, schauen Sie unter https://github.com/deitch/searchjs nach
Es ist sowohl eine vollständig in JSON geschriebene jsql-Sprache als auch eine Referenzimplementierung. Sie können sagen: "Ich möchte alle Objekte in einem Array finden, die den Namen ===" John "&& age === 25 haben als:
Die Referenzimplementierung searchjs funktioniert sowohl im Browser als auch als Node-Npm-Paket
Es kann auch komplexe Verknüpfungen und Negationen ausführen (NICHT). Der Fall wird von Haus aus ignoriert.
Es wird noch nicht summiert oder gezählt, aber es ist wahrscheinlich einfacher, diese draußen zu machen.
quelle
Hier sind einige einfache Javascript-Bibliotheken, die ebenfalls den Trick machen:
jFunk ist eine in Bearbeitung befindliche Abfragesprache mit einer ähnlichen Syntax wie CSS / jQuery-Selektoren. Es sah vielversprechend aus, hatte aber keine Entwicklung, die über das ursprüngliche Engagement hinausging.
(hinzugefügt 2014): Das Befehlszeilentool jq hat eine ordentliche Syntax, ist aber leider eine AC-Bibliothek. Anwendungsbeispiel:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
quelle
In MongoDB würde dies so funktionieren (in der Mongo-Shell gibt es Treiber für eine Sprache Ihrer Wahl).
Die ersten drei Befehle fügen die Daten in Ihre Sammlung ein. (Starten Sie einfach die
mongod
Server und stellen Sie eine Verbindung mit demmongo
Client her.)Die nächsten beiden verarbeiten die Daten.
$match
Filter,$group
giltsum
undlist
, respectively.quelle
SpahQL ist das vielversprechendste und durchdachteste davon, soweit ich das beurteilen kann. Ich kann es nur empfehlen.
quelle
Ich habe gerade eine freigebbare Version einer clientseitigen JS-lib (defiant.js) fertiggestellt, die genau das tut, wonach Sie suchen. Mit defiant.js können Sie eine JSON-Struktur mit den Ihnen bekannten XPath-Ausdrücken abfragen (keine neuen Syntaxausdrücke wie in JSONPath).
Beispiel für die Funktionsweise (siehe Browser hier http://defiantjs.com/defiant.js/demo/sum.avg.htm ):
Wie Sie sehen können, erweitert DefiantJS das globale Objekt JSON um eine Suchfunktion, und das zurückgegebene Array wird mit Aggregatfunktionen geliefert. DefiantJS enthält einige andere Funktionen, die jedoch für dieses Thema nicht relevant sind. Wie auch immer, Sie können die Bibliothek mit einem clientseitigen XPath-Evaluator testen. Ich denke, Leute, die nicht mit XPath vertraut sind, werden diesen Evaluator nützlich finden.
http://defiantjs.com/#xpath_evaluator
Weitere Informationen zu defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js
Ich hoffe, Sie finden es nützlich ... Grüße
quelle
Google hat ein Projekt namens Lovefield ; Ich habe es gerade herausgefunden und es sieht interessant aus, obwohl es mehr damit zu tun hat, als nur Unterstrich oder Lodash zu verwenden.
https://github.com/google/lovefield
Ein weiterer interessanter neuer Eintrag in diesem Bereich namens jinqJs .
http://www.jinqjs.com/
Wenn Sie die Beispiele kurz betrachten , sieht es vielversprechend aus, und das API-Dokument scheint gut geschrieben zu sein.
quelle
Ich werde mich dem Gedanken anschließen, nur Ihr eigenes Javascript zu verwenden, aber für etwas Anspruchsvolleres könnten Sie sich Dojo-Daten ansehen . Ich habe es nicht verwendet, aber es sieht so aus, als ob es Ihnen ungefähr die Art von Abfrageoberfläche bietet, nach der Sie suchen.
quelle
Die aktuelle Jaql-Implementierung zielt auf die Verarbeitung großer Datenmengen mithilfe eines Hadoop-Clusters ab. Daher ist dies möglicherweise mehr als erforderlich. Es läuft jedoch problemlos ohne einen Hadoop-Cluster (erfordert jedoch weiterhin den Hadoop-Code und seine Abhängigkeiten, um kompiliert zu werden, die meistens enthalten sind). Eine kleine Implementierung von Jaql, die in Javascript und einen Browser eingebettet werden könnte, wäre eine großartige Ergänzung des Projekts.
Ihre obigen Beispiele lassen sich leicht in Jaql schreiben:
Natürlich gibt es noch viel mehr. Beispielsweise:
Jaql kann unter http://code.google.com/p/jaql/ heruntergeladen / diskutiert werden.
quelle
Sie können auch Underscore.js verwenden , eine Bibliothek mit Schweizer Messern, um Sammlungen zu bearbeiten. Mit
_.filter
,_.pluck
,_.reduce
können Sie tun , SQL-ähnliche Abfragen.Underscore.js funktioniert sowohl clientseitig als auch serverseitig und ist eine bemerkenswerte Bibliothek.
Sie können auch Lo-Dash verwenden , eine Abzweigung von Underscore.js mit besseren Leistungen.
quelle
Wann immer möglich, würde ich die gesamte Abfrage auf das Backend auf dem Server verlagern (auf die SQL-Datenbank oder einen anderen nativen Datenbanktyp). Grund dafür ist, dass die Abfrage schneller und optimierter durchgeführt werden kann.
Ich weiß, dass jSON eigenständig sein kann und es möglicherweise +/- für eine Abfragesprache gibt, aber ich kann den Vorteil nicht erkennen, wenn Sie Daten aus dem Backend in einen Browser abrufen, wie die meisten JSON-Anwendungsfälle. Fragen Sie das Backend ab und filtern Sie es, um die benötigten Daten so klein wie möglich zu halten.
Wenn Sie aus irgendeinem Grund im Front-End abfragen müssen (meistens in einem Browser), würde ich vorschlagen, nur array.filter zu verwenden (warum etwas anderes erfinden?).
Das heißt, was ich für nützlicher halte, ist eine Transformations-API für json ... sie sind nützlicher, da Sie die Daten, sobald Sie sie haben, möglicherweise auf verschiedene Arten anzeigen möchten. Sie können jedoch wieder viel davon auf dem Server tun (was viel einfacher zu skalieren sein kann) als auf dem Client - WENN Sie das Server-Client-Modell verwenden.
Nur meine 2 Pence wert!
quelle
Überprüfen Sie https://github.com/niclasko/Cypher.js (Hinweis: Ich bin der Autor)
Es handelt sich um eine Javascript-Implementierung ohne Abhängigkeit der Abfragesprache der Cypher-Diagrammdatenbank zusammen mit einer Diagrammdatenbank. Es läuft im Browser (getestet mit Firefox, Chrome, IE).
Mit Relevanz für die Frage. Es kann zum Abfragen von JSON-Endpunkten verwendet werden:
Hier ist ein Beispiel für das Abfragen eines komplexen JSON-Dokuments und dessen Analyse:
Beispiel für eine JSON-Abfrage von Cypher.js
quelle
PythonQL bietet eine eingebettete Syntax , dass IMHO eine Verbesserung auf SQL ist, vor allem , weil
group
,window
,where
,let
, etc. können frei miteinander vermischt werden.Dieser Code zeigt zwei verschiedene Antworten auf Ihre Frage, je nachdem, ob Sie die gesamte Struktur oder nur den Wert bearbeiten müssen. Die Ausführung gibt Ihnen das erwartete Ergebnis.
quelle
Du könntest benutzen
linq.js
.Dies ermöglicht die Verwendung von Aggregationen und Auswahlen aus einem Datensatz von Objekten als Daten anderer Strukturen.
quelle