Parser JSON wiersza poleceń systemu Unix? [Zamknięte]

128

Czy ktoś może polecić uniksowy parser JSON (wybierz swój smak), którego można by użyć do introspekcji wartości z odpowiedzi JSON w potoku?

Jé Queue
źródło
Lubię używać Pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart
1
W mieście pojawiło się nowe narzędzie: ramda-cli , które wykorzystuje curried API Ramdy i zwięzłą składnię LiveScript. Jest zbudowany tak, aby pobierać json jako dane wejściowe i tworzyć funkcje. npm install -g ramda-cli
Ehvince

Odpowiedzi:

18

Możesz użyć tego parsera wiersza poleceń (który możesz umieścić w aliasie bash, jeśli chcesz), używając modułów wbudowanych w rdzeń Perla:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
Eter
źródło
1
Jestem zdezorientowany wynikiem tego. Dane wyjściowe zawierają grube strzałki (=>) między kluczami i wartościami. To nie jest JSON.
Landon Kuhn
7
@landon: nie, dane wejściowe to JSON, a dane wyjściowe to natywna struktura danych Perla, którą można następnie w razie potrzeby dalej manipulować. Celem tej jednowierszowej informacji jest to, że generuje dane, które są znacznie łatwiejsze do odczytania.
Ether
1
Jeśli chcesz uzyskać dane wyjściowe JSON, możesz użyć tego jednowierszowego Perla:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov,
234

Wolę, python -m json.toolktóry domyślnie wydaje się być dostępny w większości systemów operacyjnych * nix.

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

Uwaga: w zależności od wersji Pythona wszystkie klucze mogą być sortowane alfabetycznie, co może być dobre lub nie. W Pythonie 2 domyślnie sortowano klucze, podczas gdy w Pythonie 3.5+ nie są one już sortowane automatycznie, ale masz możliwość jawnego sortowania według klucza:

$ echo '{"foo":1, "bar":2}' | python3 -m json.tool --sort-keys
{
    "bar": 2, 
    "foo": 1
}
muhqu
źródło
5
Niedoceniona odpowiedź. Jest to fajna alternatywa dla wiersza poleceń, jeśli celem jest sprawdzenie poprawności danego pliku JSON jako zawierającego prawidłowy JSON.
scorpiodawg,
10
ta odpowiedź nie opisuje, jak sprawdzić wartości określonego klucza.
Colin Su,
8
@ColinSu, ale to też nie było pierwotne pytanie. json.toolto tylko krótka ręka do ładnego print json. Jeśli potrzebujesz wyodrębnić / manipulować danymi json w skrypcie powłoki, jq
użyłbym
1
IMMO to niepoprawna odpowiedź, ponieważ Python json.toolrobi tylko dwie rzeczy: walidację i ładnie wypisuje json. NIE dokonuje introspekcji wartości w json, tak jak jqrobi.
Devy
1
@AdityaSriram dobrze wiedzieć! … Doda te informacje do odpowiedzi.
muhqu
145

Jeśli szukasz przenośnego narzędzia skompilowanego w C:

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

Ze strony internetowej:

jq jest jak sed dla danych JSON - można go używać do wycinania, filtrowania, mapowania i przekształcania danych strukturalnych z taką samą łatwością, z jaką sed , awk , grep i przyjaciele pozwalają bawić się tekstem.

jq może zmienić format danych, który masz, na taki, który chcesz, przy niewielkim wysiłku, a program do tego jest często krótszy i prostszy niż można by się spodziewać.

Samouczek : http://stedolan.github.com/jq/tutorial/
Podręcznik : http://stedolan.github.com/jq/manual/
Pobierz : http://stedolan.github.com/jq/download/

Daan Mortier
źródło
21
Najlepsza odpowiedź tutaj imo. Brak ciężkich zależności, małe, wydajne, dobra dokumentacja i łatwość wypróbowania. Wielkie dzięki za sugestię!
FrozenCow
W Ubuntu / Debian możesz po prostu apt install jq.
Pablo Bianchi,
1
Poprosiłem o to wiele razy temu i nauczyłem się kochać jq.
Jé Queue
63

Stworzyłem moduł specjalnie zaprojektowany do manipulacji JSON z linii poleceń:

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

  • ELASTYCZNE - narzędzie „szwajcarskiego scyzoryka” do przetwarzania danych JSON - może być używane jako prosta ładna drukarka lub jako pełnowartościowy wiersz poleceń Javascript
  • POTĘŻNY - Ujawnia pełną moc i funkcjonalność underscore.js (plus underscore.string)
  • PROSTE - Ułatwia pisanie jednowierszowych w JS, podobnie jak przy użyciu „perl -pe”
  • W ŁAŃCUCHU - wiele wywołań poleceń można połączyć w łańcuch, aby utworzyć potok przetwarzania danych
  • MULTI-FORMAT - Bogate wsparcie dla formatów wejścia / wyjścia - ładne drukowanie, ścisły JSON itp. [Wkrótce]
  • DOKUMENTOWANE - Doskonała dokumentacja wiersza poleceń z wieloma przykładami dla każdego polecenia

Pozwala naprawdę łatwo robić potężne rzeczy:

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

Ma też jeden z najlepszych dostępnych programów formatujących JSON „inteligentnych białych znaków”:

Jeśli masz jakieś prośby o dodanie funkcji, skomentuj ten post lub dodaj problem na githubie. Chętnie nadam priorytet funkcjom, które są potrzebne członkom społeczności.

Dave Dopson
źródło
Niesamowite! Ale czy można uruchamiać polecenia konsoli na danych JSON? Na przykład: mając plik JSON z tablicą adresów URL, wgetkażdy adres URL.
Camilo Martin,
@CamiloMartin - najłatwiejszym sposobem jest wydrukowanie adresów URL, po jednym w każdym wierszu, a następnie przepuszczenie go przez xargs lub równolegle do GNU.
Dave Dopson,
@DaveDopson Czy mogę użyć underscoredo analizowania zagnieżdżonego pliku JSON z zagnieżdżonymi obiektami i tablicami?
user227666,
1
@ user227666 - jasne. JSON obsługuje zagnieżdżanie wielu poziomów obiektów. Lub możesz mieć na myśli JSON, który ma ciąg, który dalej koduje JSON. Co również działa, ale wymaga tylko odrobiny wtargnięcia.
Dave Dopson,
@DaveDopson Czy wsparcie podkreślenia „zawiera„ wzorzec ”, tj. możliwy zestaw wartości (bez uwzględniania wielkości liter) dla określonego „klucza”? Próbowałem "jq" z dopasowaniem, ale to nie działa. Opublikowałem również tutaj mój kompletny przypadek użycia - stackoverflow.com/questions/25463196/ ...
ekta
14

Checkout TickTick .

To prawdziwy parser Bash JSON.

#!/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
źródło
Uwielbiam narzędzia na poziomie skorupy :)
Jé Queue,
12

Istnieje również zestaw narzędzi do przetwarzania wiersza poleceń JSON, jeśli masz na stosie node.js i npm.

I jeszcze jedno polecenie "json" do masowania JSON w linii poleceń Uniksa.

A oto inne alternatywy:


Powiązane: Narzędzie wiersza poleceń do analizowania danych wejściowych JSON dla systemu Unix?

zpoley
źródło
Łatwa instalacja na Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se
@ divideandconquer.se Przepraszamy, ale instalujesz to narzędzie używając npm z npm install json.
gitaarik
@rednaw Niestety, pakiet NPM jsonwydaje się być teraz zajęty przez zupełnie inny pakiet.
Brad,
8

Czy ktoś wspomniał o Jshon lub JSON.sh?

https://github.com/keenerd/jshon

potokiem json do niego i przechodzi przez obiekty json i wyświetla ścieżkę do bieżącego obiektu (jako tablica JSON), a następnie obiekt, bez spacji.

http://kmkeen.com/jshon/
Jshon ładuje tekst json ze stdin, wykonuje akcje, a następnie wyświetla ostatnią akcję na stdout, a także został utworzony jako część zwykłego potoku przetwarzania tekstu.

hewigovens
źródło
Przykład użycia na OSX: brew install jshon,cat *.json | jshon
kenorb
2

Możesz spróbować jsawk zgodnie z sugestią zawartą w tej odpowiedzi .

Naprawdę możesz jednak stworzyć szybki skrypt w Pythonie, aby to zrobić.

NG.
źródło
1

W przypadku Bash / Python , oto podstawowe opakowanie wokół Pythona 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 
}

Naprawdę obsługuje tylko dane w stylu zagnieżdżonego słownika, ale działa zgodnie z potrzebami i jest przydatne do przechodzenia przez json. Prawdopodobnie dałoby się to dostosować do smaku.

W każdym razie coś wyhodowanego w domu dla tych, którzy nie chcą czerpać z jeszcze jednej zewnętrznej zależności. Oczywiście z wyjątkiem Pythona.

Dawny. json_parser {field1} {field2}uruchomi się print myjson['{field1}']['{field2}'], uzyskując klucze lub powiązane z nimi wartości {field2}, oddzielone spacjami.

Aaron R.
źródło
0

Właśnie stworzyłem jkid, który jest małym eksploratorem json wiersza poleceń, który stworzyłem, aby łatwo eksplorować duże obiekty json. Obiekty można eksplorować „poprzecznie”, a opcja „podgląd” pozwala uniknąć przepełnienia konsoli.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}
Arthur
źródło
Jak mogę zainstalować jkidna Macu?
user227666,