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




to get (13)

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 von Abfragesprache, die ich verwenden kann, um ein Objekt in [0].objects where id = 3 ?


Answers

Defiant.js sieht auch ziemlich cool aus, hier ist 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

ObjectPath ist eine Abfragesprache, die XPath oder JSONPath ähnelt, aber dank eingebetteter arithmetischer Berechnungen, Vergleichsmechanismen und integrierter Funktionen viel leistungsfähiger ist. Siehe die Syntax:

Finden Sie im Geschäft alle Schuhe der roten Farbe und Preis von weniger als 50

$ .. Schuhe. * [Farbe ist "rot" und Preis <50]


github.com/dragonworx/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 Strings).

Sie können benutzerdefinierte Schemas und Zuordnungen erstellen, um vollständige Kontrolle darüber zu erhalten, wie Ihre Daten von der XPath-Engine bearbeitbar sind. Mithilfe eines Schemas können Sie definieren, wie Elemente, untergeordnete Elemente, Attribute und Knotenwerte in Ihren Daten definiert werden. Dann können Sie Ihre eigenen passenden Ausdrücke erstellen.

Wenn Sie eine Variable namens data die den JSON aus der Frage enthält, könnten Sie jsel verwenden, um zu schreiben:

jsel(data).select("//*[@id=3]")

Dadurch wird jeder Knoten mit einem id Attribut von 3 zurückgegeben. Ein Attribut ist ein primitiver Wert (Zeichenfolge, Zahl, Datum, Regex) innerhalb eines Objekts.


@Naftule - mit "defiant.js" ist es möglich, eine JSON-Struktur mit XPath-Ausdrücken abzufragen. Sehen Sie sich diesen Evaluator an, um sich ein Bild davon zu machen, 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.

Der Quellcode von defiant.js finden Sie hier:
https://github.com/hbi99/defiant.js


Gibt es eine Art Abfragesprache?

jq definiert eine Sprache, die JSONPath sehr ähnlich ist - siehe https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [welchen] kann ich einen Gegenstand in [0] .Objekten finden, wo id = 3?

Ich nehme an, dies bedeutet: Finden Sie alle JSON-Objekte unter dem angegebenen Schlüssel mit id == 3, egal wo das Objekt sein kann. Eine entsprechende jq-Abfrage wäre:

.[0].objects | .. | objects | select(.id==3)

wo "|" ist der Pipe-Operator (wie in Kommando-Shell-Pipes) und das Segment ".. | objects" entspricht "egal wo das Objekt sein darf".

Die Grundlagen von jq sind größtenteils offensichtlich oder intuitiv oder zumindest ziemlich einfach, und der Rest ist leicht zu erlernen, wenn Sie mit Kommandozeilenpipes vertraut sind. Die jq FAQ enthält Hinweise zu Tutorials und ähnlichem.

jq ist auch wie SQL, da es CRUD-Operationen unterstützt, obwohl der jq-Prozessor seine Eingabe niemals überschreibt. jq kann auch Ströme 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 hat umfassende Unterstützung für PCRE Regex)
  • Ist es Turing-vollständig? (ja)

Wenn Sie wie ich sind und Sie nur pfadbasierte _.get() ausführen _.get() , aber sich nicht um echten XPath kümmern, kann lodashs _.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'


XQuery kann verwendet werden, um JSON abzufragen, sofern der Prozessor JSON-Unterstützung bietet. Dies ist ein einfaches Beispiel, wie mit BaseX Objekte mit "id" = 1 gefunden werden können:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

Versuchen Sie, JSPath

JSPath ist eine domänenspezifische Sprache (DSL), mit der Sie in Ihren JSON-Dokumenten navigieren und nach Daten 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 stark sowohl für Node.js als auch für moderne Browser optimiert.


Json Pointer scheint auch immer mehr Unterstützung zu bekommen.


Andere Alternativen, die mir bekannt sind, sind

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

HTH.



Ich stelle dies gerade für Konfigurationsdateien fest. Ich möchte kein XML (ausführlich, grafisch, hässlich, schwer lesbar) oder das "ini" -Format (keine Hierarchie, kein echter Standard usw.) oder das Java-Format "Eigenschaften" (wie .ini) verwenden.

JSON kann alles, was sie können, aber es ist viel weniger ausführlich und für den Menschen lesbarer - und Parser sind in vielen Sprachen einfach und allgegenwärtig. Es ist nur ein Datenbaum. Out-of-Band-Kommentare sind jedoch oft notwendig, um "Standard" -Konfigurationen und dergleichen zu dokumentieren. Konfigurationen dürfen niemals "vollständige Dokumente" sein, sondern Bäume gespeicherter Daten, die bei Bedarf für Menschen lesbar sind.

Ich denke, man könnte "#": "comment" für "gültige" JSON verwenden.





javascript json xpath xquery