JSON mit Unix-Tools analysieren
Ich versuche zu Parsen von JSON zurück von eine curl-Anfrage, etwa so:
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
Den oben spaltet die JSON-in-Felder, zum Beispiel:
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
Wie Drucke ich ein bestimmtes Feld (gekennzeichnet durch die -v k=text
)?
InformationsquelleAutor der Frage auser | 2009-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Reihe von tools speziell für den Zweck der Manipulation JSON von der Befehlszeile aus, und wird viel einfacher und zuverlässiger, als es zu tun mit Awk, wie
jq
:Können Sie dies auch tun, mit Werkzeugen, die wahrscheinlich bereits auf Ihrem system installiert haben, wie Python mit der
json
- Modulund so vermeiden, dass jede zusätzliche Abhängigkeiten, wobei man noch den Vorteil einer korrekten JSON-parser. Die folgenden angenommen, Sie möchten die UTF-8 verwenden, die die original-JSON-enkodiert werden soll und ist das, was die meisten modernen terminals verwenden:Python 2:
Python 3:
Historische Notizen
Diese Antwort ursprünglich empfohlen jsawkdie sollte noch funktionieren, ist aber ein wenig umständlicher zu bedienen als
jq
und hängt auf einer standalone JavaScript-interpreter installiert, die ist seltener als ein Python-interpreter, so dass die oben genannten Antworten sind wahrscheinlich besser:Diese Antwort auch ursprünglich verwendet die Twitter-API von der Frage, aber, dass die API nicht mehr funktioniert, macht es schwer, kopieren Sie die Beispiele zu testen, und die neue Twitter API erfordert API-keys, also habe ich eingeschaltet, um über die GitHub-API, die verwendet werden können, einfach und ohne API-Schlüssel. Die erste Antwort für die ursprüngliche Frage wäre:
InformationsquelleAutor der Antwort Brian Campbell
Schnell extrahieren der Werte für einen bestimmten Schlüssel, mir persönlich gefällt die Verwendung von "grep -o", die gibt nur die regex-match. Zum Beispiel, um die "text" - Feld von tweets, so etwas wie:
Dieser regex ist robuster als Sie vielleicht denken; zum Beispiel, es geht gut mit Zeichenfolgen mit eingebetteten Kommata und Anführungszeichen escaped in Ihnen. Ich denke, mit ein wenig mehr Arbeit, die Sie machen könnte, ist eine, die wirklich garantiert, extrahieren Sie den Wert, wenn es atomar. (Wenn Sie nisten, dann ist ein regex nicht tun können, natürlich.)
Weiter sauber (wenn auch zu halten die Zeichenfolge ursprünglichen Flucht), die Sie verwenden können, so etwas wie:
| perl -pe 's/"text"://; s/^"//; s/",$//'
. (Ich habe dies für diese Analyse.)Alle die Hasser, die darauf bestehen, sollten Sie eine echte JSON-parser -- ja, das ist wichtig für Richtigkeit, aber
grep -o
ist Größenordnungen schneller als die Python-standard -json
Bibliothek, zumindest, wenn Sie diese für tweets (das sind ~2 KB). Ich bin mir nicht sicher, ob dies nur weiljson
ist langsam (ich sollte vergleichen, um yajl irgendwann), aber im Prinzip ein regex sollte schneller sein, da es die finite-state und vieles mehr optimierbare, statt einen parser zu unterstützen, Rekursion, und in diesem Fall, verbringt viel CPU-Gebäude-Bäume für Strukturen, die Sie nicht kümmern. (Wenn jemand schrieb Sie einen finite state transducer, der hat die richtige (depth-limited) JSON-parsing, das wäre fantastisch! In der Zwischenzeit haben wir die "grep -o".)Wartbaren code zu schreiben, ich benutze immer ein echtes parsing-Bibliothek. Ich habe nicht versucht,jsawkaber wenn es gut funktioniert, wäre das Adresse Punkt #1.
Einer letzten, wackier, Lösung: ich schrieb ein Skript, dass verwendet Python
json
und extrahiert die Schlüssel, die Sie möchten, in tab-getrennte Spalten, dann Rohr durch ein wrapper umawk
ermöglicht, namentlich eingetragenen Zugang zu Spalten. Hier: die json2tsv und tsvawk scripts. Also, für dieses Beispiel wäre es:Dieser Ansatz nicht Adresse #2, ist ineffizienter als eine einzelne Python-Skript, und es ist ein wenig spröde: es zwingt Normalisierung von Zeilenumbrüchen und Tabulatoren in string-Werte zu spielen schön mit awk Feld/Datensatz-Trennzeichen Sicht auf die Welt. Aber es funktioniert, bleiben Sie auf der Kommandozeile, mit mehr Richtigkeit als
grep -o
.InformationsquelleAutor der Antwort Brendan OConnor
Auf der Grundlage, dass einige der Empfehlungen hier (esp in den Kommentaren) vorgeschlagen, die Verwendung von Python, ich war enttäuscht, nicht ein Beispiel finden.
So, hier ist ein one-liner zu bekommen, einen einzigen Wert aus einer JSON-Daten. Es wird davon ausgegangen, dass Sie das Weiterreichen der Daten in (von irgendwo) und so sollte nützlich sein, in einer Skript-Kontext.
InformationsquelleAutor der Antwort paulkmoore
Folgenden MartinR und Boecko lead:
Werden, die Ihnen eine extrem grep-freundliche Ausgabe. Sehr bequem:
InformationsquelleAutor der Antwort jnrg
Konnte man nur download
jq
- Programm für Ihre Plattform und ausführen (chmod +x jq
):Extrahiert
"name"
- Attribut aus dem json-Objekt.jq
- homepage sagt, es ist wiesed
für JSON-Daten.InformationsquelleAutor der Antwort jfs
Verwenden Python-JSON-support anstelle der Verwendung von awk!
Etwas wie dieses:
InformationsquelleAutor der Antwort martinr
Mit Node.js
Wenn das system Knoten installiert ist, ist es möglich, die
-p
print-und-e
evaulate Skript Fahnen mitJSON.parse
zu ziehen beliebigen Wert, der benötigt wird.Ein einfaches Beispiel für die Verwendung der JSON-string
{ "foo": "bar" }
und herausziehen der Wert von "foo":Da haben wir Zugang zu
cat
- und andere Dienstprogramme, wir können das für Dateien:Oder einem anderen format, wie eine URL enthält, JSON:
InformationsquelleAutor der Antwort x9hb8wcy6quezjk
Haben Sie gefragt, wie Schießen selbst in den Fuß, und ich bin hier, um die Munition:
Könnten Sie
tr -d '{}'
stattsed
. Aber verlassen Sie sich ganz offensichtlich den gewünschten Effekt.Wenn Sie wollen, um Streifen aus der äußeren Anführungszeichen -, Rohr-das Ergebnis der oben durch
sed 's/\(^"\|"$\)//g'
Ich denke, dass auch andere geklungen haben ausreichend alarm. Ich werde stehen, mit einem Handy um einen Krankenwagen zu rufen. Feuern, wenn bereit.
InformationsquelleAutor der Antwort Dennis Williamson
Mit Bash mit Python
Erstellen Sie ein bash-Funktion in Ihr .bash_rc Datei
Dann
Hier ist die gleiche Funktion, aber mit der Fehlerüberprüfung.
Wobei $# -ne 1 stellt sicher, dass mindestens 1 Eingang und-t 0 stellen Sie sicher, dass Sie umleiten aus dem Rohr.
Das schöne an dieser Implementierung ist, dass Sie Zugriff auf geschachtelte json-Werte und erhalten json zurück! =)
Beispiel:
Wenn Sie wollen wirklich einbilden, Sie könnten pretty-print die Daten:
InformationsquelleAutor der Antwort Joe Heyming
Parsen von JSON mit PHP-CLI
Wohl off-topic, aber da Vorrang herrscht diese Frage bleibt unvollständig ohne eine Erwähnung von unserem treuen und Gläubigen PHP, hab ich Recht?
Mit dem gleichen Beispiel JSON, sondern ermöglicht es einer Variablen zuweisen zu reduzieren Dunkelheit.
Nun für PHP Güte, mit file_get_contents und die php://stdin stream wrapper.
oder wie bereits mit fgets und das schon geöffneter stream auf CLI Konstante STDIN.
nJoy!
InformationsquelleAutor der Antwort nickl-
TickTick ein JSON-parser, geschrieben in bash (<250 Zeilen code)
Hier ist der Autor snippit aus seinem Artikel, Stellen Sie sich eine Welt, wo die Bash unterstützt JSON:
InformationsquelleAutor der Antwort CoolAJ86
Native Bash-version:
Funktioniert auch gut mit backslashes (\) und Anführungszeichen (")
InformationsquelleAutor der Antwort maikel
Version, die verwendet Ruby und http://flori.github.com/json/
oder prägnanter:
InformationsquelleAutor der Antwort boecko
Können Sie
jshon
:InformationsquelleAutor der Antwort kev
Leider ist die Spitze gewählt Antwort, die verwendet
grep
gibt die voll Spiel, die nicht funktioniert hat in meinem Szenario, aber wenn Sie wissen das JSON-format wird konstant bleiben, die Sie verwenden können lookbehind und lookahead extrahieren Sie die gewünschten Werte ein.InformationsquelleAutor der Antwort Daniel Sokolowski
hier ist ein Weg, können Sie es mit awk
InformationsquelleAutor der Antwort ghostdog74
Jemanden, der hat auch xml-Dateien, vielleicht möchten schauen sich meine Xidel. Es ist ein cli, dependency-free JSONiq Prozessor. (d.h. es unterstützt auch XQuery für xml-oder json-Verarbeitung)
Beispiel in der Frage wäre:
Oder mit meiner eigenen, nicht-standard-Erweiterung) syntax:
InformationsquelleAutor der Antwort BeniBela
Für komplexere JSON-parsing-ich schlage vor, mit python jsonpath Modul (von Stefan Goessner) -
sudo easy_install -U jsonpath
Beispiel-Datei.json (aus http://goessner.net/articles/JsonPath) -
Analysiert (Auszug alle Buchtitel mit Preis < 10) -
Ausgabe -
HINWEIS: Die oben genannte Befehlszeile enthält keine Fehlerprüfung. für die vollständige Lösung mit der Fehlerüberprüfung sollten Sie kleine python-Skript, und wickeln Sie den code mit try-except.
InformationsquelleAutor der Antwort shlomosh
Wenn Sie php:
Zum Beispiel:
wir haben die Ressource, die bietet json mit dem Länder-iso-codes: http://country.io/iso3.json und wir können leicht sehen, dass es in einer shell mit curl:
aber es sieht nicht sehr bequem, und nicht lesbar, besser parse json und sehen lesbare Struktur:
Dieser code druckt so etwas wie:
wenn Sie verschachtelte arrays dieser Ausgabe viel besser aussieht...
Hoffen, dass dies hilfreich ist...
InformationsquelleAutor der Antwort Vladimir Kovpak
Können Sie versuchen, so etwas wie dieses -
InformationsquelleAutor der Antwort jaypal singh
Parsen von JSON ist schmerzhaft, in ein shell-Skript. Mit einer mehr ausgebildeten Sprache, erstellen Sie ein Werkzeug zum extrahieren von JSON-Attribute in einer Weise, im Einklang mit shell scripting Konventionen. Sie können Ihr neues Werkzeug zu lösen, die unmittelbare shell-scripting-problem und dann fügen Sie es zu Ihrem kit für zukünftige Situationen.
Betrachten Sie zum Beispiel ein tool jsonlookup so, dass wenn ich sage
jsonlookup access token id
es wird wieder das Attribut id definiert im Attribut token definiert im Attribut Zugang von stdin, das ist vermutlich JSON-Daten. Wenn das Attribut nicht vorhanden ist, das tool gibt nichts zurück (exit-status 1). Wenn das Parsen fehlschlägt, exit-status 2 und eine Nachricht auf stderr. Wenn die Suche erfolgreich ist, wird das tool druckt den Wert eines Attributs.Mit einem unix-Werkzeug für die genaue Zweck extrahieren von JSON-Werte können Sie ganz einfach verwenden Sie es in shell-Skripten:
Jeder Sprache tun, die für die Umsetzung der jsonlookup. Hier ist eine ziemlich prägnante python version:
InformationsquelleAutor der Antwort mcnabicus
Einer zwei-liner, die verwendet python. Es funktioniert besonders gut, wenn Sie schreiben eine single .sh-Datei, und Sie wollen nicht abhängig von einem anderen .py-Datei. Es nutzt auch die Verwendung von Rohr
|
.echo "{\"field\": \"value\"}"
ersetzt werden kann durch etwas Druck ein json-auf den stdout.InformationsquelleAutor der Antwort Adam Kurkiewicz
Dies ist ein guter Anwendungsfall für pythonpy:
InformationsquelleAutor der Antwort RussellStewart
Wenn
pip
ist verfügbar auf dem system dann:Beispiele:
InformationsquelleAutor der Antwort Alexey Dubkov
Nun, dass die Powershell ist cross-Plattform, ich dachte, ich würde werfen Sie einen Ausweg gibt, da ich finde, es ist ziemlich intuitiv und äußerst einfach.
Cmdlet " ConvertFrom-Json konvertiert das JSON in ein Powershell custom object, so können Sie ganz einfach die Arbeit mit den Eigenschaften von diesem Punkt an. Wenn Sie nur wollte, dass das 'id' - Eigenschaft zum Beispiel, Sie würden genau dies tun:
Wenn Sie wollte rufen die ganze Sache innerhalb von Bash, dann müsste man es so nennen:
Natürlich gibt es eine Reine Powershell-Weg, es zu tun, ohne curl, die wäre:
Schließlich gibt es auch "ConvertTo-Json', die konvertiert ein benutzerdefiniertes Objekt zu JSON genauso einfach. Hier ist ein Beispiel:
Welche produzieren würde schön JSON-so:
}
Zugegeben, mit einem Windows-shell unter Unix ist etwas gotteslästerlich, aber Powershell ist wirklich gut, bei manchen Dingen, und das Parsen von JSON und XML sind ein paar von Ihnen. Diese auf der GitHub-Seite für die cross-Plattform-version https://github.com/PowerShell/PowerShell
InformationsquelleAutor der Antwort user2233949
Dies ist ein weiterer
bash
&python
hybrid Antwort. Ich stellte diese Antwort, weil ich wollte, um weitere komplexe JSON-Ausgabe, aber eine Reduzierung der Komplexität von meiner bash Anwendung. Ich will zu knacken öffnen Sie das folgende JSON-Objekt aus http://www.arcgis.com/sharing/rest/info?f=json inbash
:Während dieser Ansatz erhöht die Komplexität in der Python-Funktion, die bash-Nutzung wird einfacher:
Die Ausgabe des obigen Skripts ist:
Ich Hinzugefügt Unterstützung für arrays verwenden, so können Sie
.length
und, wenn die source ist ein string-array verwenden, können Sie.join
:Welche Ausgänge:
InformationsquelleAutor der Antwort Stephen Quan
Wenn jemand will nur zu extrahieren Werte aus einfachen JSON-Objekte ohne die Notwendigkeit für verschachtelte Strukturen ist es möglich, reguläre Ausdrücke verwenden, ohne auch nur die bash.
Hier ist eine Funktion, die ich definiert mit bash reguläre Ausdrücke, basierend auf den JSON-standard:
Vorsichtsmaßnahmen: Objekte und arrays werden nicht unterstützt Wert, aber alle anderen Werte in der Norm definiert sind, unterstützt. Auch, ein paar auf einander abgestimmt werden, egal, wie tief Sie in das JSON-Dokument ist es, solange es hat genau die gleichen Namen für den Schlüssel ein.
Mit OP ' s Beispiel:
InformationsquelleAutor der Antwort Helder Pereira
Hier ist eine gute Referenz. In diesem Fall:
InformationsquelleAutor der Antwort Max Barrass
Niet ist ein Werkzeug, das Ihnen helfen, extrahieren von Daten aus json oder yaml Datei direkt in der shell/bash CLI.
Betrachten Sie eine json-Datei mit dem Namen project.json mit folgendem Inhalt:
Können Sie niet so:
InformationsquelleAutor der Antwort Herve
habe ich diese zu extrahieren, video-Dauer von ffprobe json-Ausgabe :
es kann verwendet werden, zu extrahieren Wert aus einer json :
InformationsquelleAutor der Antwort Ehsan Chavoshi