Wie das Parsen von JSON-Dateien auf der Linux-Kommandozeile mit jq

0
64
Fatmawati Achmad Zaenuri/Shutterstock

JSON ist eine der beliebtesten Formate für die übertragung von text-basierten Daten rund um das web. Es ist überall, und Sie sind verpflichtet, über Sie kommen. Wir zeigen Ihnen, wie Sie zu handhaben es von der Linux-Befehlszeile mithilfe der jq-Befehl.

JSON und jq

JSON steht für JavaScript Object Notation. Es ist eine Regelung, die es erlaubt, Daten, die kodiert werden in nur-text-Dateien, in einer selbst-beschreibenden Art und Weise. Es gibt keine Kommentare in eine JSON-Datei—der Inhalt sollte selbsterklärend sein. Jeder Wert hat einen text-string namens “name” oder “Schlüssel”. Dies sagt Ihnen, was die Daten Wert ist. Zusammen sind Sie bekannt als name:Wert-Paare, oder Schlüssel / Wert-Paare. Ein Doppelpunkt (:) trennt den Schlüssel von dessen Wert.

Ein “Objekt” ist eine Sammlung von Schlüssel:Wert-Paaren. In einer JSON-Datei, ein Objekt beginnt mit einer geöffneten geschweiften Klammer ({) und endet mit einer schließenden geschweiften Klammer (}). JSON unterstützt auch “arrays”, die sind geordnete Listen von Werten. Ein array beginnt mit einer öffnenden eckigen Klammer ([) und endet mit einer schließenden man (]).

Aus diesen einfachen Definitionen, natürlich, willkürliche Komplexität entstehen kann. Zum Beispiel können Objekte geschachtelt werden innerhalb von Objekten. Objekte können arrays enthalten, und arrays können auch Objekte enthalten. All das kann open-ended Ebenen verschachteln.

In der Praxis, obwohl, wenn das layout von JSON-Daten ist unübersichtlich, das design der Daten-layout sollte wahrscheinlich ein Umdenken. Natürlich, wenn Sie nicht die Generierung der JSON-Daten, nur versuchen, es zu benutzen, haben Sie kein Mitspracherecht in Ihrem layout. In diesen Fällen, leider, Sie müssen nur mit ihm zu beschäftigen.

Die meisten Programmiersprachen haben die Bibliotheken oder Module, die es Ihnen erlauben das Parsen der JSON-Daten. Leider ist die Bash-shell hat keine solche Funktionalität.

Notwendigkeit ist die Mutter der Erfindung, wenn die jq-Dienstprogramm wurde geboren! Mit jq, können wir leicht zu Parsen von JSON in der Bash-shell. Und es ist egal, ob Sie arbeiten, gut entwickelt, elegant, JSON, oder der Stoff Albträume gemacht sind.

Wie zu Installieren jq

Wir hatten zu installieren, jq auf allen Linux-Distributionen, die wir verwendet, um Forschung in diesem Artikel.

Installieren jq auf Ubuntu Tippen Sie diesen Befehl:

sudo apt-get install jq

Installieren jq auf Fedora, geben Sie diesen Befehl ein:

sudo dnf installieren jq

Installieren jq auf Manjaro, geben Sie diesen Befehl ein:

sudo pacman -Sy jq

Wie man JSON Lesbar

JSON kümmert sich nicht um Leerzeichen, und das layout nicht beeinflussen. Solange es folgt den Regeln der JSON-Grammatik, Systeme, Verfahren JSON Lesen können und verstanden. Weil dieses, JSON ist oft übertragen als eine einfache lange Schnur, ohne jede Rücksicht auf das layout. Dies spart ein wenig Platz, weil Tabstopps, Leerzeichen, neue-Zeile-Zeichen nicht mit einbezogen werden in das JSON-Format. Natürlich, die Kehrseite dieser ist, wenn ein Mensch versucht, es zu Lesen.

Ziehen wir eine kurze JSON-Objekt, das von der NASA-Website, die uns sagt, die position der Internationalen Raumstation. Verwenden wir curl, die download-Dateien abrufen, die das JSON-Objekt für uns.

Wir kümmern uns nicht über die status-Nachrichten curl in der Regel erzeugt, also wir ‘ ll geben Sie die folgende, mit der-s – (silent) – option:

curl -s http://api.open-notify.org/iss-now.json

Jetzt, mit ein bisschen Mühe, kann man das Lesen. Sie müssen wählen Sie die Daten Werte, aber es ist nicht einfach oder bequem. Lassen Sie uns das wiederholen, aber dieses mal werden wir Rohres durch jq.

jq Filter verwendet zum Parsen von JSON und die einfachsten dieser Filter ist ein Punkt (.), das bedeutet “drucken, die das gesamte Objekt.” Standardmäßig jq ziemlich-druckt die Ausgabe.

Wir setzen Sie alle zusammen und geben Sie den folgenden:

curl -s http://api.open-notify.org/iss-now.json | jq .

Das ist viel besser! Nun, wir können sehen, genau was Los ist.

Das gesamte Objekt wird dann in geschweiften Klammern. Es enthält zwei Schlüssel:name-Paare: Nachricht und Zeitstempel. Es enthält auch ein Objekt namens iss_position, die enthält zwei Schlüssel:Wert-Paare: Längen-und Breitengrad.

Wir werden versuchen, dies einmal mehr. Dieses mal werden wir geben Sie Folgendes ein, und leiten Sie die Ausgabe in eine Datei namens “iss.json”:

curl -s http://api.open-notify.org/iss-now.json | jq . > iss.json
Katze iss.json

Dies gibt uns eine gut angelegte Kopie des JSON-Objekts auf unserer Festplatte.

RELATED: Wie Verwenden von curl zum Herunterladen von Dateien Aus dem Linux-Kommandozeile

Zugriff Auf Datenwerte

Wie wir oben gesehen haben, jq die Daten extrahieren können Werte wird geleitet durch die aus JSON. Es kann auch die Arbeit mit JSON, in einer Datei gespeichert. Wir arbeiten mit lokalen Dateien, damit der Befehl Linie ist nicht überladen mit curl-Befehle. Das sollte es etwas einfacher machen, zu Folgen.

Die einfachste Möglichkeit zum extrahieren von Daten aus einer JSON-Datei ist die Bereitstellung einer Schlüssel-Namen zu erhalten, seine Daten Wert. Geben Sie einen Zeitraum und der name des Schlüssels, ohne einen Raum zwischen Ihnen. Dieser erstellt einen filter aus dem Schlüssel name. Wir müssen auch sagen, jq die JSON-Datei zu verwenden.

Wir geben Sie den folgenden, um die Nachricht abzurufen Wert:

jq .Nachricht iss.json

jq druckt den text der Nachricht ein Wert in das terminal-Fenster.

Wenn Sie einen Schlüssel-Namen, der Leerzeichen oder Satzzeichen, die Sie haben, um wickeln Sie Ihre filter in Anführungszeichen. Pflege ist in der Regel ergriffen werden, um Zeichen, zahlen und Unterstriche nur so die JSON-Schlüssel-Namen sind nicht problematisch.

Zuerst geben wir die folgenden abrufen der timestamp-Wert:

jq .timestamp iss.json

Der timestamp-Wert abgerufen und ausgedruckt in das terminal-Fenster.

Aber wie können wir den Zugriff auf die Werte innerhalb der iss_position Objekt? Wir können das JSON-Punkt-notation. Wir zählen die iss_position Objekt-Namen in die “path” um den Wert key. Um dies zu tun, wird der name des Objekts, der Schlüssel ist innen vor den Namen des Schlüssels selbst.

Wir geben Sie die folgende, einschließlich der latitude-key name (Hinweis: kein Leerzeichen zwischen “.iss_position” und “.Breitengrad”):

jq .iss_position.latitude iss.json

Extrahieren Sie mehrere Werte, müssen Sie Folgendes tun:

  • Liste der wichtigsten Namen in der Befehlszeile.
  • Trennen Sie Sie mit Komma (,).
  • Schließen Sie in Anführungszeichen (“) oder Apostrophe (‘).

Mit dem im Verstand, geben wir die folgenden:

jq “.iss_position.Breitengrad, .timestamp” iss.json

Die beiden Werte drucken, um das terminal-Fenster.

Arbeiten mit Arrays

Let ‘ s greifen eine andere JSON-Objekt von der NASA.

Dieses mal verwenden wir eine Liste der Astronauten, die im Raum sind jetzt:

curl -s http://api.open-notify.org/astros.json

Okay, das funktioniert, also machen wir es auch.

Wir werden geben Sie den folgenden, um Rohr durch jq und leiten es an einer Datei namens “astro.json”:

curl -s http://api.open-notify.org/astros.json | jq . > astro.json

Jetzt lasst uns geben Sie den folgenden zu prüfen, unsere Datei:

weniger astro.json

Wie unten gezeigt, jetzt sehen wir die Liste der Astronauten im Weltraum, als auch Ihre Raumschiffe.

Dieses JSON-Objekt enthält ein array namens Personen. Wir wissen, dass es ein array, weil die öffnende Klammer ([) (in der Abbildung oben markiert). Es ist ein array von Objekten, die enthalten jeweils zwei Schlüssel:Wert-Paare: name und Handwerk.

Wie wir es früher gemacht hat, können wir die JSON-Punkt-notation, um auf die Werte zuzugreifen. Wir müssen auch die Klammern ([]) im Namen des Arrays.

Mit all das im Hinterkopf, wir geben Sie den folgenden:

jq “.Leute[].name” astro.json

Dieses mal, alle name-Werte drucken, um das terminal-Fenster. Was wir gefragt, jq zu tun war, drucken Sie die name-Wert für jedes Objekt im array. Recht ordentlich, nicht wahr?

Wir können rufen Sie den Namen von einem einzigen Objekt, wenn wir deren position im array innerhalb der eckigen Klammern ([]) auf der Kommandozeile. Das array verwendet null-offset-Indizierung, was bedeutet, das Objekt in der ersten position des Arrays ist null.

Zugriff auf das Letzte Objekt in das array, das Sie verwenden können, -1; auf die zweite bis Letzte Objekt im array, -2, und so weiter.

Manchmal, das JSON-Objekt liefert die Anzahl der Elemente im array, was ist der Fall mit diesem ein. Zusammen mit dem array, es enthält einen Schlüssel:name pair genannten Zahl mit einem Wert von sechs.

Die folgende Anzahl der Objekte sind in diesem array:

jq “.Menschen[1].name” astro.json
jq “.Menschen[3].name” astro.json
jq “.Menschen[-1].name” astro.json
jq “.Menschen[-2].name” astro.json

Sie können auch eine start-und end-Objekt in das array. Dies wird als “schneiden”, und es kann ein wenig verwirrend sein. Denken Sie daran, das array verwendet ein null-offset.

Zum abrufen der Objekte vom index der position zwei, bis zu (aber nicht einschließlich) das Objekt an der Indexposition vier, wir geben Sie den folgenden Befehl ein:

jq “.Menschen[2:4]” astro.json

Dies druckt die Objekte im array-index zwei (das Dritte Objekt im array) und drei (das vierte Objekt im array). Es Stoppt die Verarbeitung an array-index vier, das ist das fünfte Objekt in das array.

Der Weg, um dies zu verstehen ist, zu Experimentieren auf der Kommandozeile. Sie werden bald sehen, wie es funktioniert.

Wie Verwenden Sie Rohre mit Filter

Sie können leiten Sie die Ausgabe von einem filter zu einem anderen, und Sie nicht haben, um zu lernen, ein neues symbol. Das gleiche wie der Linux-Kommandozeile jq verwendet den vertikalen Balken (|) für ein Rohr.

Wir sagen jq pipe Menschen-array in der .name filter, die sollten die Liste mit den Namen der Astronauten in das terminal-Fenster.

Wir geben Sie den folgenden:

jq “.Leute[] | .name” astro.json

VERWANDTE: Wie man Rohre auf Linux

Erstellen von Arrays und Ändern Ergebnisse

Wir können jq zum erstellen neuer Objekte, wie arrays. In diesem Beispiel werden wir drei Werte extrahieren und erstellen Sie ein neues array enthält die Werte. Hinweis: die öffnung ([) und schließende eckige Klammern (]) sind auch die ersten und letzten Zeichen im filter-string.

Wir geben Sie den folgenden:

jq “[.iss-position.Breitengrad, iss_position.Längengrad .timestamp]” iss.json

Die Ausgabe ist in Klammern eingeschlossen und durch Kommas voneinander getrennt, so dass es eine richtig gebildet array.

Numerische Werte können auch manipuliert werden, wie Sie sind, abgerufen werden. Lassen Sie uns ziehen Sie den Zeitstempel aus der ISS-position-Datei, und extrahieren Sie es erneut und ändern Sie den Wert, der zurückgegeben wird.

Dazu geben wir die folgenden:

jq “.timestamp” iss.json
jq “.timestamp – 1570000000” iss.json

Dies ist nützlich, wenn Sie brauchen, um hinzuzufügen, oder entfernen Sie einen standard-offset aus einem array von Werten.

Lassen Sie uns geben Sie den folgenden, um uns daran erinnern, was auf der iss.json-Datei enthält:

jq . iss.json

Sagen wir, wir wollen, um loszuwerden, die Nachricht Schlüssel / Wert-paar. Es hat nichts zu tun mit der position der Internationalen Raumstation. Es ist nur ein flag, der angibt, die Lage wurde erfolgreich abgerufen. Wenn es überschüssig ist, können wir verzichten darauf. (Man könnte auch einfach ignorieren.)

Wir können jq ‘löschen’ Funktion del(), zum löschen eines Schlüssel / Wert-paar. Zum löschen der Nachricht Schlüssel / Wert-paar, wir geben diesen Befehl ein:

jq “del(.Botschaft)” iss.json

Beachten Sie diese nicht wirklich löschen Sie es aus der “iss.json” – Datei, sondern nur entfernt es aus der Ausgabe des Befehls. Wenn Sie brauchen, um eine neue Datei erstellen, ohne die message-key:value paar in es, den Befehl ausführen, und leiten Sie die Ausgabe in eine neue Datei.

Komplizierter JSON-Objekte

Let ‘ s abrufen, einige weitere NASA-Daten. Dieses mal verwenden wir ein JSON-Objekt, das die information enthält Meteoriteneinschlag Websites aus der ganzen Welt. Dies ist eine größere Datei mit weitaus komplexer JSON-Struktur als die, die wir behandelt haben vorher.

Erstens, wir ‘ ll geben Sie den folgenden, um es umleiten in eine Datei namens “Streiks.json”:

curl -s https://data.nasa.gov/resource/y77d-th95.json | jq . > Streiks.json

Um zu sehen, was JSON sieht so aus, wir geben Sie den folgenden:

weniger Streiks.json

Wie unten gezeigt, wird die Datei beginnt mit einer öffnenden eckigen Klammer ([), sodass das gesamte Objekt ist ein array. Die Objekte in den Arrays sind Sammlungen von Schlüssel:Wert-Paare, und es gibt eine verschachtelte Objekt, die so genannte geolocation. Das geolocation-Objekt enthält weitere Schlüssel:Wert-Paaren, und ein array mit dem Namen koordiniert.

Wir rufen die Namen der meteor Streiks aus dem Objekt an der Indexposition 995 über das Ende des Arrays.

Wir werden geben Sie den folgenden, um eine pipe mit JSON durch drei Filter:

jq “.[995:] | .[] | .name” Streiks.json

Die Filter-Funktion in der folgenden Weise:

  • .[995:]: Das sagt jq, die Objekte zu Bearbeiten von array-index 995 über das Ende des Arrays. Keine Zahl nach dem Doppelpunkt ( : ) ist, was sagt jq weiterhin das Ende des Arrays.
  • .[]: Dieses array iterator erzählt jq die Verarbeitung der einzelnen Objekte im array.
  • .name: Dieser filter extrahiert den Namen Wert.

Mit einer leichten Veränderung, können wir extrahieren die letzten 10 Objekte aus dem array. Ein “-10” weist jq, um die Bearbeitung von Objekten 10 zurück vom Ende des Arrays.

Wir geben Sie den folgenden:

jq “.[-10:] | .[] | .name” Streiks.json

Genauso, wie wir in den vorherigen Beispielen können wir geben Sie den folgenden, um ein einzelnes Objekt auszuwählen:

jq “.[650].name” Streiks.json

Wir können auch schneiden die Saiten. So zu tun, wir werden geben Sie die folgende auf Anfrage die ersten vier Zeichen des namens des Objekts im array-index 234:

jq “.[234].name[0:4]” Streiks.json

Wir können auch sehen, ein bestimmtes Objekt in seiner Gesamtheit. Wir haben zu diesem Zweck geben Sie den folgenden und fügen Sie einen array-index ohne Schlüssel:Wert Filter:

jq “.[234]” Streiks.json

Wenn Sie sehen wollen, nur die Werte, die Sie tun können, die gleiche Sache ohne die key-Namen.

Für unser Beispiel geben wir diesen Befehl ein:

jq “.[234][]” Streiks.json

Abrufen mehrerer Werte von jedem Objekt, wir trennen Sie Sie mit Kommas in den folgenden Befehl ein:

jq “.[450:455] | .[] | .Namen, .Masse” zuschlägt.json

Wenn Sie abrufen möchten verschachtelte Werte, die Sie haben, um die Objekte identifizieren, die den “Weg” zu Ihnen.

Zum Beispiel, um die Referenz der Koordinaten-Werte, die wir haben, gehören der allumfassenden array, das geolocation-verschachtelte Objekt, und die verschachtelte Koordinaten-array, wie unten gezeigt.

Um zu sehen, die Koordinaten Werte für das Objekt an index-position 121 der Reihe, wir geben Sie den folgenden Befehl ein:

jq “.[121].geolocation.Koordinaten[]” Streiks.json

Die Länge-Funktion

Der jq Länge-Funktion gibt verschiedene Metriken, die je nach dem was es ist angewendet worden, wie zum Beispiel:

  • Streicher: Die Länge der Zeichenfolge in Byte.
  • Objekte: Die Anzahl der Schlüssel / Wert-Paare in das Objekt.
  • Arrays: Die Anzahl der array-Elemente im array.

Der folgende Befehl gibt die Länge der name-Wert in 10 der Objekte im JSON-array, angefangen bei index-position 100:

jq “.[100:110] | .[].name | Länge” Streiks.json

Um zu sehen, wie viele Schlüssel / Wert-Paare sind im ersten Objekt in dem array, geben wir diesen Befehl ein:

jq “.[0] | Länge” Streiks.json

Die Tasten Funktionieren

Verwenden Sie die Tasten Funktion, um herauszufinden, über die JSON Sie haben, mit zu arbeiten. Es kann Ihnen sagen, was die Namen der Schlüssel sind, und wie viele Objekte gibt es in ein array.

Finden Sie die Schlüssel der Personen-Objekt in der “astro.json” – Datei, wir geben diesen Befehl ein:

jq “.Menschen.[0] | keys” astro.json

Um zu sehen, wie viele Elemente im Menschen-array, geben wir diesen Befehl ein:

jq “.Menschen | Tasten” astro.json

Dies zeigt, es gibt sechs, null-offset-array-Elemente, nummeriert von null bis fünf.

Der hat () – Funktion

Sie können die hat () – Funktion zum feststellen des JSON und sehen, ob ein Objekt einen bestimmten Schlüssel einen Namen. Hinweis: der name des Schlüssels sein muss, eingeschlossen in Anführungszeichen. Wir werden wickeln Sie den filter-Befehl in einfache Anführungszeichen (‘), wie folgt:

jq ‘.[] | hat(“nametype”)’ Streiks.json

Jedes Objekt im array wird geprüft, wie unten gezeigt.

Wenn Sie überprüfen möchten, ein bestimmtes Objekt, Sie enthalten den index-position im array filtern, wie folgt:

jq ‘.[678] | hat(“nametype”)’ Streiks.json

Gehen Sie nicht in der Nähe von JSON, Ohne Es

Die jq-Dienstprogramm ist das perfekte Beispiel für die professionelle, leistungsfähige, schnelle software, die macht das Leben in der Linux-Welt so eine Freude ist.

Dies war nur eine kurze Einführung in die Allgemeinen Funktionen dieses Befehls, es gibt eine ganze Menge mehr dahinter. Werden Sie sicher, dass Sie die umfassende jq Handbuch, wenn Sie wollen, tiefer zu Graben.

LESEN SIE WEITER

  • “Wie “Verschieben” oder “Kopieren”, um Windows 10 das Kontext-Menü
  • › Keine Kabel Erforderlich: so Streamen Sie das NBA-All-Star-Spiel
  • › Wie Legen Sie eine Standard-Zoomstufe im Firefox
  • › Die Zukunft des Handys: Was Ist Faltbar Glas?
  • › So Aktivieren und Verwenden Sie die Tab-Gruppen in Google Chrome