Unix-Befehlszeilen-JSON-Parser? [geschlossen]

128

Kann jemand einen Unix-JSON-Parser (wählen Sie Ihren Geschmack) empfehlen, mit dem Werte aus einer JSON-Antwort in einer Pipeline überprüft werden können?

Jé Queue
quelle
Ich benutze gerne Pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart
1
Es gibt ein neues Tool in der Stadt: ramda-cli , das Ramdas Curry-API und die knappe LiveScript-Syntax verwendet. Es wurde entwickelt, um json als Eingabe- und Kompositionsfunktionen zu verwenden. npm install -g ramda-cli
Ehvince

Antworten:

18

Sie können diesen Befehlszeilenparser (den Sie bei Bedarf in einen Bash-Alias ​​einfügen können) verwenden, indem Sie Module verwenden, die in den Perl-Kern integriert sind:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
Äther
quelle
1
Ich bin durch die Ausgabe davon verwirrt. Die Ausgabe enthält fette Pfeile (=>) zwischen Tasten und Werten. Dies ist nicht JSON.
Landon Kuhn
7
@landon: Nein, die Eingabe ist JSON, und die Ausgabe ist eine native Perl-Datenstruktur, die Sie bei Bedarf weiter bearbeiten können. Der Sinn dieses Einzeilers ist, dass er Daten erzeugt, die viel einfacher zu lesen sind.
Ether
1
Wenn Sie eine JSON-Ausgabe wünschen, können Sie diesen Perl-Einzeiler verwenden:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov
232

Ich bevorzuge, python -m json.toolwelche standardmäßig auf den meisten * nix-Betriebssystemen standardmäßig verfügbar zu sein scheint.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Es sollte jedoch beachtet werden, dass dadurch alle Schlüssel alphabetisch sortiert werden. Dies ist oder kann eine gute Sache sein, wenn der JSON von einer Sprache generiert wurde, die ungeordnete HashMaps verwendet ...

muhqu
quelle
5
Unterschätzte Antwort. Dies ist eine nette Befehlszeilenalternative, wenn das Ziel darin besteht, eine bestimmte JSON-Datei als mit gültigem JSON enthaltend zu validieren.
Scorpiodawg
10
In dieser Antwort wurde nicht beschrieben, wie die Werte des angegebenen Schlüssels überprüft werden.
Colin Su
8
@ColinSu aber das war auch nicht die ursprüngliche Frage. json.toolist nur eine kurze Hand zu hübschem Druck json. Wenn Sie json-Daten in einem Shell-Skript extrahieren / manipulieren müssen, würde ich verwenden, jqwas bei dem, was es tut,
einfach
@muhqu ja, ich weiß, ich benutze json.toolzehnmal täglich. Ich glaube, ich habe die Bedeutung von "introspec" in der Frage falsch verstanden, danke für Ihren Hinweis.
Colin Su
1
IMMO ist dies eine falsche Antwort, da Python json.toolnur zwei Dinge tut: validieren und hübsch drucken json. Es werden KEINE Werte im json überprüft, wie dies der jqFall ist.
Devy
144

Wenn Sie nach einem tragbaren C-kompilierten Tool suchen:

http://stedolan.github.com/jq/

Von der Website:

jq ist wie sed für JSON-Daten - Sie können es verwenden, um strukturierte Daten mit der gleichen Leichtigkeit zu schneiden, zu filtern, zuzuordnen und zu transformieren, mit der sed , awk , grep und Freunde Sie mit Text spielen lassen.

jq kann das Datenformat, das Sie haben, mit sehr geringem Aufwand in das gewünschte Datenformat zerlegen, und das Programm dafür ist oft kürzer und einfacher als erwartet.

Tutorial : http://stedolan.github.com/jq/tutorial/
Handbuch : http://stedolan.github.com/jq/manual/
Download : http://stedolan.github.com/jq/download/

Daan Mortier
quelle
20
Beste Antwort hier imo. Keine großen Abhängigkeiten, kleine, leistungsstarke, gute Dokumentation und ein Kinderspiel zum Ausprobieren. Vielen Dank für diesen Vorschlag!
FrozenCow
Auf Ubuntu / Debian kann man einfach apt install jq.
Pablo A
Ich habe das vor vielen Mond gefragt und gelernt zu lieben jq.
Jé Queue
63

Ich habe ein Modul erstellt, das speziell für die Befehlszeilen-JSON-Manipulation entwickelt wurde:

https://github.com/ddopson/underscore-cli

  • FLEXIBLE - DAS "Schweizer Taschenmesser " -Tool zur Verarbeitung von JSON-Daten - kann als einfacher hübscher Drucker oder als voll funktionsfähige Javascript-Befehlszeile verwendet werden
  • POWERFUL - Zeigt die volle Leistung und Funktionalität von underscore.js (plus underscore.string) an.
  • EINFACH - Erleichtert das Schreiben von JS-Einzeilern ähnlich der Verwendung von "perl -pe"
  • CHAINED - Mehrere Befehlsaufrufe können miteinander verkettet werden, um eine Datenverarbeitungspipeline zu erstellen
  • MULTI-FORMAT - Umfangreiche Unterstützung für Eingabe- / Ausgabeformate - hübsches Drucken, striktes JSON usw. [in Kürze]
  • DOKUMENTIERT - Hervorragende Befehlszeilendokumentation mit mehreren Beispielen für jeden Befehl

Es ermöglicht Ihnen, mächtige Dinge wirklich einfach zu tun:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Und es hat einen der besten verfügbaren "Smart-Whitespace" -JSON-Formatierer:

Wenn Sie Funktionswünsche haben, kommentieren Sie diesen Beitrag oder fügen Sie ein Problem in github hinzu. Ich würde gerne Funktionen priorisieren, die von Mitgliedern der Community benötigt werden.

Dave Dopson
quelle
Genial! Ist es jedoch möglich, Konsolenbefehle für JSON-Daten auszuführen? Beispiel: Bei einer JSON-Datei mit einem URL-Array wird wgetjede URL angegeben.
Camilo Martin
@CamiloMartin - Der einfachste Weg, dies zu tun, besteht darin, die URLs auszudrucken, eine URL pro Zeile, und diese dann über xargs oder GNU parallel auszuführen.
Dave Dopson
@ DaveDopson Kann ich underscoreverschachtelte JSON mit verschachtelten Objekten und Arrays analysieren?
user227666
1
@ user227666 - sicher. JSON unterstützt das Verschachteln vieler Objektebenen. Oder Sie meinen JSON mit einer Zeichenfolge, die weiteres JSON codiert. Was auch funktioniert, aber nur ein bisschen Munging erfordert.
Dave Dopson
@ DaveDopson Untersticht die Unterstützung "enthält" ein "Muster", dh. für einen bestimmten "Schlüssel" die mögliche Menge von (case-insenstitive) Werten? Ich habe "jq" mit match versucht, aber es funktioniert nicht. Habe
ekta
13

Kasse TickTick .

Es ist ein echter Bash JSON-Parser.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``
coolaj86
quelle
Ich muss Werkzeuge auf Shell-Ebene lieben :)
Jé Queue
12

Es gibt auch ein JSON-Toolkit zur Befehlszeilenverarbeitung für die wenn Sie zufällig node.js und npm in Ihrem Stapel haben.

Und ein weiterer "json" -Befehl zum Massieren von JSON in Ihrer Unix-Befehlszeile.

Und hier sind die anderen Alternativen:


Verwandte: Befehlszeilentool zum Parsen von JSON-Eingaben für Unix?

zpoley
quelle
Einfach zu installieren, unter Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se
@ divideandconquer.se Entschuldigung, aber Sie installieren dieses Tool mit npm mit npm install json.
Gitaarik
@rednaw Leider jsonscheint das NPM- Paket jetzt von einem völlig anderen Paket übernommen zu werden.
Brad
8

Hat jemand Jshon oder JSON.sh erwähnt?

https://github.com/keenerd/jshon

Pipe Json dorthin, und es durchläuft die JSON-Objekte und druckt den Pfad zum aktuellen Objekt (als JSON-Array) und dann zum Objekt ohne Leerzeichen aus.

http://kmkeen.com/jshon/
Jshon lädt json-Text von stdin, führt Aktionen aus, zeigt dann die letzte Aktion auf stdout an und wurde als Teil der üblichen Textverarbeitungspipeline festgelegt.

hewigovens
quelle
Beispiel Verwendung unter OSX : brew install jshon,cat *.json | jshon
Kenorb
2

Sie können jsawk wie in dieser Antwort vorgeschlagen ausprobieren .

Wirklich, Sie könnten ein schnelles Python-Skript erstellen, um dies zu tun.

NG.
quelle
1

Für Bash / Python gibt es hier einen grundlegenden Wrapper für Pythons simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Es behandelt wirklich nur den verschachtelten Wörterbuchstil von Daten, aber es funktioniert für das, was ich brauchte, und ist nützlich, um durch den JSON zu gehen. Es könnte wahrscheinlich nach Geschmack angepasst werden.

Wie auch immer, etwas Eigenes für diejenigen, die keine weitere externe Abhängigkeit herstellen möchten. Außer natürlich Python.

Ex. json_parser {field1} {field2}würde laufen print myjson['{field1}']['{field2}']und entweder die Schlüssel oder die damit verbundenen Werte durch {field2}Leerzeichen trennen.

Aaron R.
quelle
0

Ich habe gerade jkid erstellt , einen kleinen Befehlszeilen- JSON -Explorer, den ich erstellt habe, um große JSON-Objekte einfach zu erkunden. Objekte können "quer" untersucht werden, und eine "Vorschau" -Option dient dazu, einen Konsolenüberlauf zu vermeiden.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}
Arthur
quelle
Wie kann ich jkidin Mac installieren ?
user227666