wake-up-neo.net

Gibt es ein JSON-Äquivalent von XQuery/XPath?

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? 

195
Naftuli Kay

Ja, es heißt JSONPath . Die Quelle befindet sich jetzt auf GitHub .

Es ist auch in DOJO integriert.

113

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 .

20
Brian Clozel

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.)

18
Simon East

Andere Alternativen, die mir bekannt sind, sind

  1. JSONiq Spezifikation, die zwei Subtypen von Sprachen angibt: einen, der XML-Details verbirgt und JS-artige Syntax bereitstellt, und einen, der die XQuery-Syntax mit JSON-Konstruktoren und dergleichen bereichert. Zorba implementiert JSONiq.
  2. Corona , das auf MarkLogic aufbaut, bietet eine REST - Schnittstelle zum Speichern, Verwalten und Durchsuchen von XML-, JSON-, Text- und Binär-Inhalten.
  3. MarkLogic 6 und höher bieten eine ähnliche REST - Schnittstelle wie Corona aus der Box.
  4. MarkLogic 8 und höher unterstützt JSON nativ sowohl in der XQuery- als auch in der serverseitigen JavaScript-Umgebung. Sie können XPath darauf anwenden.

HTH.

15
grtjn

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.

13
dfilatov

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]
9
Christian Grün

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
7
Epoc

Json Pointer scheint auch Unterstützung zu bekommen.

7
karlfreeman

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]

6
Ela Bednarek

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.

6
Ali

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:

  • unterstützt es reguläre Ausdrücke? (jq 1.5 bietet umfassende Unterstützung für PCRE-Regex)
  • ist es Turing-Komplett? (ja)
5
peak

@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

4
Hakan Bilgin

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'
1
adittes

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.

0
Satyajit Paul