Frage

Gibt es eine (grob) SQL- oder XQuery-ähnliche Sprache für JSON Abfrage?

Ich denke an sehr kleinen Datenmengen, die schön zu JSON Karte, wo es schön wäre leicht zu beantworten Fragen wie „Was sind alle Werte von X, wobei Y> 3“ oder die üblichen SUM / COUNT Typ Operationen zu tun .

Wie vollständig erfundenes Beispiel, so etwas wie folgt aus:

[{"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 sowohl clientseitige und serverseitige mit den Ergebnissen der entsprechenden sprachspezifischen Datenstruktur (oder vielleicht gehalten als JSON)

umgewandelt werden funktionieren würde

Eine schnelle googeln lässt vermuten, dass die Leute darüber gedacht und umgesetzt, ein paar Dinge ( JAQL ), aber es scheint nicht, wie eine Standard-Nutzung oder einen Satz von Bibliotheken hat noch entstanden. Während jede Funktion ziemlich trivial ist auf seinem eigenen zu implementieren, wenn jemand bereits es richtig gemacht hat ich will nicht das Rad neu erfinden.

Irgendwelche Vorschläge?

Edit: Das in der Tat eine schlechte Idee sein kann, oder JSON kann zu allgemein ein Format für das sein, was ich denke .. Der Grund für eine Abfragesprache zu wollen, anstatt nur die Summations tun / etc Funktionen direkt wie erforderlich, dass ich hoffen, dass die Abfragen dynamisch basierend auf Benutzereingaben zu bauen. Kinda wie das Argument, dass „wir SQL nicht benötigen, können wir nur die Funktionen schreiben wir brauchen“. Schließlich entweder das wird aus der Hand oder Sie Ihre eigene Version von SQL am Ende zu schreiben, wie Sie es weiter und weiter drücken. (Okay, ich weiß, dass ein bisschen ein dummes Argument ist, aber Sie bekommen die Idee ..)

War es hilfreich?

Lösung

Sicher, wie etwa:

Sie scheinen alle etwas unfertige zu sein, aber bis zu einem gewissen Grad funktionieren. Sie sind auch ähnlich wie XPath und XQuery-Konzept; obwohl XML und JSON haben unterschiedliche Denkmodelle (hierarchische vs Objekt / Struktur).

EDIT Sep-2015: Eigentlich gibt es jetzt JSON Pointer Standard, der sehr einfache und effiziente Traversal von JSON Inhalten ermöglicht. Es ist nicht nur formal spezifiziert, sondern auch von vielen JSON-Bibliotheken unterstützt. So würde ich es tatsächlich echter nützlicher Standard nennen, obwohl aufgrund seiner begrenzten Aussagekraft kann es oder auch nicht Query Language per se betrachtet werden.

Andere Tipps

Ich würde mein Projekt arbeite ich an genannt jLinq empfehlen. Ich bin auf der Suche nach Feedback, damit ich Interesse hätte, zu hören, was Sie denken.

Wenn können Sie Abfragen schreiben ähnlich, wie man es in LINQ ...

var results = jLinq.from(records.users)

    //you can join records
    .join(records.locations, "location", "locationId", "id")

    //write queries on the data
    .startsWith("firstname", "j")
    .or("k") //automatically remembers field and command names

    //even query joined items
    .equals("location.state", "TX")

    //and even do custom selections
    .select(function(rec) {
        return {
            fullname : rec.firstname + " " + rec.lastname,
            city : rec.location.city,
            ageInTenYears : (rec.age + 10)
        };
    });

Es ist voll zu erweiterbar!

Die Dokumentation ist noch im Gange, aber man kann es immer noch versuchen, online.

Update: XQuery 3.1 kann entweder XML oder JSON abfragen - oder beides zusammen. Und XPath 3.1 können auch.

Die Liste wächst:

jmespath wirklich ganz einfach funktioniert und gut, http://jmespath.org/ Es wird von Amazon in der AWS-Befehlszeilenschnittstelle verwendet wird, so verfügt es über recht stabil sein.

Die eingebaute in array.filter() Methode meisten macht von diese sogenannten Javascript Query Bibliotheken veraltet

Sie können setzen, wie viele Bedingungen innerhalb der Delegierten wie man sich vorstellen kann: einen einfachen Vergleich, starts usw. habe ich nicht getestet, aber man könnte wahrscheinlich Nest filtert auch für die Abfrage von inneren Sammlungen

.

ObjectPath ist einfach und ligthweigth Abfragesprache für JSON Dokumente komplexer oder unbekannter Struktur. Es ist ähnlich wie XPath oder JSONPath, aber viel leistungsfähiger dank eingebetteter arithmetische Berechnungen, Vergleichsmechanismen und integrierten Funktionen.

Beispiel

Python-Version ist ausgereift und in der Produktion eingesetzt. JS ist noch in der Beta.

Wahrscheinlich in naher Zukunft werden wir ein vollwertiges Javascript-Version zur Verfügung stellen. Wir wollen auch, um es weiter zu entwickeln, so dass es als einfachere Alternative zu Mongo Abfragen dienen könnte.

jq ist ein J SON q uery Sprache, vor allem für die Befehlszeile sollte aber mit Bindung an eine Vielzahl von Programmiersprachen (Java, node.js, pHP, ...) und auch über JQ-web .

Hier sind einige Abbildungen auf die ursprüngliche Frage basiert, die diese JSON als Beispiel gegeben:

 [{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
  

SUM (X), wobei Y> 0 (entspräche 7)

map(select(.y > 0)) | add
  

LIST (X), wobei Y> 0 (entspräche [3,4])

map(.y > 0)

JQ Syntax erweitert JSON-Syntax

Jeder JSON Ausdruck ist ein gültiger jq Ausdruck, und Ausdrücke wie [1, (1+1)] und { "a": (1 + 1)}. `Zeigen, wie jq erweitert JSON-Syntax

Ein anschauliches Beispiel ist der jq Ausdruck:

{a,b}

, die, angesichts der JSON-Wert {"a":1, "b":2, "c": 3} wertet {"a":1, "b":2}.

Wenn Sie .NET verwenden dann Json.NET unterstützt LINQ-Abfragen über die Spitze von JSON. Diese Post hat einige Beispiele. Es unterstützt Filterung, Zuordnung, Gruppierung, etc.

Eine andere Möglichkeit, dies zu betrachten würde mongoDB Sie benutzen speichern kann mongo Ihre JSON in und Abfrage es dann über die mongodb Abfragesyntax.

OK, ist dieser Beitrag ein wenig alt, aber ... wenn Sie SQL-ähnliche Abfrage in nativen JSON (oder JS-Objekten) auf JS Objekten tun wollen, werfen Sie einen Blick auf https://github.com/deitch/searchjs

Es ist sowohl eine jsql Sprache ganz in JSON geschrieben, und eine Referenzimplementierung. Sie können sagen: „Ich alle Objekte in einem Array finden möchte, die Namen haben ===“ John“&& Alter === 25, wie:

{name:"John",age:25,_join:"AND"}

Die Referenzimplementierung searchjs Arbeiten im Browser sowie als Knoten npm Paket

npm install searchjs

Es kann auch Dinge wie komplexe Joins und Negation (NOT). Es ignoriert nativen Fall.

Es ist noch nicht Summierung tun oder zählen, aber es ist wahrscheinlich einfacher, die außerhalb zu tun.

Hier einige einfache JavaScript-Bibliotheken, die auch den Trick tun:

  • Dollar Q ist eine schöne leichte Bibliothek. Es hat ein vertrautes Gefühl auf der Verkettungs Syntax populär gemacht von jQuery und ist nur 373 SLOC.
  • SpahQL ist eine voll ausgestattete Abfragesprache mit einer Syntax ähnlich wie XPath ( Homepage , Github
  • jfunk ist eine laufende Abfragesprache, mit einer Syntax ähnlich wie CSS / jQuery Selektoren. Es sah vielversprechend aus, hat aber keine Entwicklung über sein hatte in ersten begehen.

  • (hinzugefügt 2014): das jq Befehlszeilenprogramm eine saubere Syntax hat, aber leider ist es ac Bibliothek. Beispiel für die Verwendung:

    < package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'

MongoDB , das ist, wie es funktionieren würde (in der Mongo Shell, gibt es Treiber für eine Sprache Ihre Wahl).

db.collection.insert({"x": 2, "y": 0}); // notice the ':' instead of ','
db.collection.insert({"x": 3, "y": 1});
db.collection.insert({"x": 4, "y": 1});

db.collection.aggregate([{$match: {"y": {$gt: 0}}}, 
                         {$group: {_id: "sum", sum: {$sum: "$x"}}}]);
db.collection.aggregate([{$match: {"y": {$gt: 0}}}, 
                         {$group: {_id: "list", list: {$push: "$x"}}}]);

Die ersten drei Befehle einfügen, die Daten in Ihre Sammlung. (Einfach den mongod Server starten und eine Verbindung mit dem mongo-Client.)

Die nächsten beiden Verfahren werden die Daten. $match Filter, $group wendet die sum und list sind.

SpahQL ist die vielversprechendste und gut durchdacht von ihnen, soweit ich das beurteilen kann. Ich empfehle es heraus überprüfen.


Ich habe gerade ein lösbares Version eines client JS-lib (defiant.js) beendet das tut, was Sie suchen. Mit defiant.js können Sie eine JSON-Struktur mit dem XPath-Ausdrücken abfragen Sie mit (ohne neue Syntax Ausdrücke wie in JSONPath) vertraut sind.

Beispiel, wie es funktioniert (siehe es in Browser hier http: // defiantjs .com / defiant.js / demo / sum.avg.htm ):

var data = [
       { "x": 2, "y": 0 },
       { "x": 3, "y": 1 },
       { "x": 4, "y": 1 },
       { "x": 2, "y": 1 }
    ],
    res = JSON.search( data, '//*[ y > 0 ]' );

console.log( res.sum('x') );
// 9
console.log( res.avg('x') );
// 3
console.log( res.min('x') );
// 2
console.log( res.max('x') );
// 4

Wie Sie sehen können, erstreckt sich DefiantJS das globale Objekt JSON mit einer Suchfunktion und das zurückgegebene Array ist mit Aggregatfunktionen geliefert. DefiantJS enthält einige andere Funktionalitäten aber die sind aus dem Anwendungsbereich für dieses Thema. Anywho, können Sie die lib mit einem client XPath Evaluator testen. Ich denke, dass die Menschen nicht vertraut mit XPath werden diesen Auswerter nützlich finden.
http://defiantjs.com/#xpath_evaluator

Weitere Informationen über defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js

Ich hoffe, Sie finden es nützlich ... Grüße

  1. Google hat ein Projekt mit dem Namen Lovefield ; nur das herausfand, und es sieht interessant, obwohl es mehr beteiligt ist, als nur in Strich oder lodash fallen.

    https://github.com/google/lovefield

  

Lovefield ist eine relationale Abfrage-Engine in reinem JavaScript geschrieben. Es   auch hilft bei Daten über den Browser-Seite persistierenden, z.B.   IndexedDB indem Daten lokal zu speichern. Es bietet SQL-ähnliche Syntax und   arbeitet Cross-Browser (unterstützt derzeit Chrome 37+, 31+ Firefox, IE   10+ und Safari 5.1 + ...


  1. Ein weiterer interessanter letzter Eintrag in diesem Raum namens jinqJs .

    http://www.jinqjs.com/

    Sie kurz die Beispiele , es sieht vielversprechend aus, und die API Dokument erscheint gut geschrieben werden.


function isChild(row) {
  return (row.Age < 18 ? 'Yes' : 'No');
}

var people = [
  {Name: 'Jane', Age: 20, Location: 'Smithtown'},
  {Name: 'Ken', Age: 57, Location: 'Islip'},
  {Name: 'Tom', Age: 10, Location: 'Islip'}
];

var result = new jinqJs()
  .from(people)
  .orderBy('Age')
  .select([{field: 'Name'}, 
     {field: 'Age', text: 'Your Age'}, 
     {text: 'Is Child', value: isChild}]);

  

jinqJs ist ein kleines, einfaches, leicht und dehnbar javaScript   Bibliothek, die keine Abhängigkeiten haben. jinqJs bietet eine einfache Möglichkeit,   SQL-Abfragen wie auf JavaScript-Arrays auszuführen, Sammlungen und Web   Dienste, die eine JSON Antwort zurückgeben. jinqJs ist ähnlich wie Microsofts   Lambda-Ausdruck für .Net, und es bietet ähnliche Fähigkeiten   Abfrage Sammlungen eine SQL-ähnliche Syntax und Prädikats-Funktion verwenden.   jinqJs Zweck ist eine SQL-ähnliche Erfahrung für Programmierer zur Verfügung zu stellen   vertraut mit LINQ-Abfragen.

Ich werde zweiten der Begriff nur Ihre eigene Javascript verwenden, aber nach etwas anspruchsvollere Sie unter dojo Daten . Haben es nicht, aber es sieht aus wie Sie in etwa die Art der Abfrage-Schnittstelle gibt, die Sie suchen.

Die aktuelle Implementierung Ziele Jaql große Datenverarbeitung eines Hadoop-Cluster verwenden, so könnte es sein, als Sie benötigen. Aber es läuft einfach ohne Hadoop-Cluster (aber immer noch erfordert die Hadoop-Code und seine Abhängigkeiten kompiliert werden, die meist enthalten sind). Eine kleine Implementierung von Jaql, die in Javascript und ein Browser wäre eine große Bereicherung für das Projekt eingebettet werden.

über Ihre Beispiele leicht geschrieben in jaql werden:

$data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];

$data -> filter $.y > 0 -> transform $.x -> sum(); // 7

$data -> filter $.y > 0 -> transform $.x; // [3,4]

Natürlich gibt es auch mehr viel. Zum Beispiel:

// Compute multiple aggregates and change nesting structure:
$data -> group by $y = $.y into { $y, s:sum($[*].x), n:count($), xs:$[*].x}; 
    // [{ "y": 0, "s": 2, "n": 1, "xs": [2]   },
    //  { "y": 1, "s": 7, "n": 2, "xs": [3,4] }]

// Join multiple data sets:
$more = [{ "y": 0, "z": 5 }, { "y": 1, "z": 6 }];
join $data, $more where $data.y == $more.y into {$data, $more};
    // [{ "data": { "x": 2, "y": 0 }, "more": { "y": 0, "z": 5 }},
    //  { "data": { "x": 3, "y": 1 }, "more": { "y": 1, "z": 6 }},
    //  { "data": { "x": 4, "y": 1 }, "more": { "y": 1, "z": 6 }}]

Jaql kann unter http://code.google.com/p/jaql heruntergeladen / diskutiert /

können Sie auch Underscore.js die im Grunde eine Schweizer-Messer-Bibliothek Sammlungen zu manipulieren. Mit _.filter , _.pluck , _.reduce SQL-ähnliche Abfragen tun.

var data = [{"x": 2, "y": 0}, {"x": 3, "y": 1}, {"x": 4, "y": 1}];

var posData = _.filter(data, function(elt) { return elt.y > 0; });
// [{"x": 3, "y": 1}, {"x": 4, "y": 1}]

var values = _.pluck(posData, "x");
// [3, 4]

var sum = _.reduce(values, function(a, b) { return a+b; });
// 7

Underscore.js arbeitet sowohl clientseitige und serverseitige und ist eine bemerkenswerte Bibliothek.

Sie können auch Lo-Dash verwenden, die eine Gabel von Underscore.js mit besseren Leistungen ist.

Wenn immer möglich würde ich alle die anfragende an das Backend auf dem Server verschieben (auf die SQL-DB oder anderen native Datenbank-Typen). Grund dafür ist, dass es schneller sein wird und optimiert die Abfrage zu tun.

Ich weiß, dass JSon allein stehen kann, und es kann sein, +/- für eine Abfragesprache, die aber ich kann den Vorteil, nicht sehen, wenn Sie Daten aus dem Backend zu einem Browser abrufen, da die meisten der JSON Anwendungsfälle. Abfrage und Filter im Backend so klein Daten zu erhalten, die benötigt wird.

Wenn Sie aus irgendeinem Grund auf dem Front-End abfragen müssen (meist in einem Browser), dann würde ich vorschlagen, nur Array.filter mit (warum etwas anderes erfinden?).

Das heißt, was ich denke, wäre nützlicher ist eine Transformation API für json ... sie sind nützlich, da, wenn Sie die Daten haben Sie können es in einer Reihe von Möglichkeiten angezeigt werden soll. Aber auch hier sind, können Sie viel von diesem auf dem Server tun (was viel einfacher sein kann maßstäblich) als auf dem Client - wenn Sie Server verwenden <->. Client-Modell

Just my 2 Pence wert!

Schauen Sie sich https://github.com/niclasko/Cypher.js (Anmerkung : ich bin der Autor)

Es ist eine Null-Abhängigkeit Javascript Implementierung der Cypher Graph-Datenbank-Abfragesprache zusammen mit einer Graph-Datenbank. Es läuft im Browser (getestet mit Firefox, Chrome, IE).

Mit Relevanz für die Frage. Es kann verwendet werden JSON Endpunkte abzufragen:

load json from "http://url/endpoint" as l return l limit 10

Hier ist ein Beispiel für ein komplexes JSON Dokument abfragt und es Durchführung Analyse:

Cypher.js JSON query Beispiel

Sie könnten verwenden linq.js .

Dies ermöglicht Aggregationen und selectings aus einem Datensatz von Objekten zu verwenden, da andere Strukturen Daten.

var data = [{ x: 2, y: 0 }, { x: 3, y: 1 }, { x: 4, y: 1 }];

// SUM(X) WHERE Y > 0     -> 7
console.log(Enumerable.From(data).Where("$.y > 0").Sum("$.x"));

// LIST(X) WHERE Y > 0    -> [3, 4]
console.log(Enumerable.From(data).Where("$.y > 0").Select("$.x").ToArray());
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top