Wie die Arbeit Mit JSON Auf der Kommandozeile

0
223

Linux hat keine eingebaute Möglichkeit zum verarbeiten von JSON richtig, doch viele APIs, JSON zurückgeben Ausgang. Hier ist, wie zu analysieren und verwenden Sie JSON-Daten in Ihren shell-Skripten mit einem einfachen Dienstprogramm.

Parsen von JSON Mit jq

jq ist ein Dienstprogramm, das kann, handle alles, was Sie tun möchten, mit JSON. Es ist super einfach zu installieren; laden Sie einfach die binary und verschieben Sie es auf Ihrem Ordner auf Ihrem WEG, in der Regel /usr/local/bin/. Es hat keine Abhängigkeiten, so ist es nur ein binary zum download. Es gibt downloads für macOS und Windows sowie.

Um zu starten, können Sie Rohr JSON, um es zu pretty-print it. Einige APIs, verkleinern Sie Ihre Antworten, um Platz zu sparen, was zu diesem schrecklichen Durcheinander, wenn Sie curl etwas in die Konsole ein:

Rohr es zu jq etwa so:

curl https://api.example.com/ | jq

Und es ist jetzt lesbar, mit syntax-highlighting zu Booten:

Wenn Sie geben, jq ein Befehl, es wird es verwenden, um wählen Sie die Daten aus dem JSON, ähnlich wie sed arbeitet auf text. Wir verwenden diese JSONPlaceholder als Beispiel-API, um zu versuchen, die Befehle. Der Einfachheit halber, lassen wir aus der curl-Befehl und Rohr, damit alles lesbar ist. Sie können auch mit curl eine Datei-und pipe-Katze zu jq, wenn Sie nicht wollen, um zu sehen, die curl-Ausgabe jedes mal, wenn Sie testen einen neuen Befehl.

Ein einfacher Punkt”. ” steht für die Daten-Pipe in jq. Wenn Sie wollen einfach nur, um einen Schlüssel von dem Objekt, das Sie tun können:

jq ‘.status’

Sie können dieses nest als gut; zum Beispiel, ‘.Daten.geo.host’ zurückkehren würde, ein Wert, der weiter unten in der Liste. Optional können Sie hinzufügen, ein Fragezeichen für die Fehlerprüfung wie “.Daten.geo?.host“, die angibt, dass die Eigenschaft optional ist.

Arbeiten mit arrays ist, wo jq interessant wird. Sie können mit den eckigen Klammern um ein bestimmtes array-element. Sie könnten zum Beispiel den Namen des ersten Eintrags mit:

jq ‘.[0].name”

Sie können die slice-arrays mit [2:5], und verwenden Sie die gleichen Fragezeichen-syntax für optionale Eigenschaften. Behalten Sie allerdings im Hinterkopf, dass wenn ein array leer ist, bedeutet es nicht, dass es eine ungültige Eigenschaft.

Allerdings werden Sie wahrscheinlich abholen wollen einen speziellen Eintrag auf der Grundlage der Daten, die innerhalb es, nicht auf die Reihenfolge des Arrays. Um das zu tun, übergeben Sie die ganze Reihe der select-Dienstprogramm:

jq ‘.[] | select – (.name | enthält(“Leanne”))’

Dieses Filter-array nur Elemente enthalten, die den test bestehen; in diesem Fall passt der name-Feld enthält einen bestimmten Namen? Dies kann jeder Boolesche Ausdruck, selbst-Arithmetik wie wählen Sie(.count >= 2).

Neuformatierung JSON

jq konstruieren kann JSON als auch, was bedeutet, dass Sie können es verwenden, um zu formatieren sowie JSON-Eingabe. Sie können Objekte einfach durch das einwickeln von Ihnen in geschweiften Klammern, und pass jq Aussagen als die Werte. jq-Ausgabe wird das neue Objekt. Zum Beispiel:

Katze json | jq ‘.[0] | {name: .name, Firma: .Firma}’

Ausgänge schön auf der Kommandozeile:

Dies ist zwar nützlich für die Strippen aus nur die Informationen, die Sie wollen, Sie können auch der Bau von neuen Objekten mit jq Befehle.

Für die vollständige Referenz über alle jq-der syntax, Sie können konsultieren Sie die online-Bedienungsanleitung.

Alternativen zu jq

Wenn Sie nicht möchten, dass ein anderes Programm verwenden, könnten Sie ein paar alternativen. Die einfachste Methode ist zu verzichten, tut es in der bash, und verwenden Sie stattdessen eine Skriptsprache wie Python oder JavaScript (mit Knoten), um die eigentliche Verarbeitung. Sie würde stattdessen leiten Sie die JSON-Ausgabe des Befehls in eine Datei:

curl https://api/example.com/ > json.txt

Und dann laden Sie Sie in einer Variablen innerhalb des Skripts für den Einsatz.

Sie können auch einfachen text-Auswahl-Dienstprogramme; zum Beispiel, wenn Sie nur mit einem bestimmten Schlüssel aus der Antwort, Sie könnte verwenden grep neben den regulären Ausdruck auszuwählen, der Wert:

grep “name” | sed ‘s/”name”: “(.*)”/1/’

Dies kann jedoch (und wird wahrscheinlich) brechen sehr leicht mit den änderungen in der JSON. Übergeben Sie die Benutzer-API zurückgegeben, die den Namen der einzelnen Benutzer, sondern auch der Benutzername (der grep mit so gut), sowie den Namen des Unternehmens (die hatte den exakt gleichen Schlüssel). Es sei denn, Sie planen, um Konto für alle diese, die Sie verwenden sollten, etwas, das bewusst ist, die die JSON-Struktur, anstatt behandeln Sie es als text.