JSON je lehký a jazykově nezávislý formát pro ukládání dat, který lze snadno integrovat s většinou programovacích jazyků a je také snadno pochopitelný pro lidi, samozřejmě při správném formátování. Slovo JSON znamená J avaS kript O bjekt N otace, i když začíná JavaScriptem a primárně se používá k výměně dat mezi serverem a prohlížečem, ale nyní se používá v mnoha oblastech včetně vestavěných systémů. Zde analyzujeme a pěkně vytiskneme JSON pomocí nástrojů příkazového řádku v Linuxu. Je to extrémně užitečné pro práci s velkými daty JSON ve skriptech shellu nebo pro manipulaci s daty JSON ve skriptu shellu.
Co je pěkný tisk?
Data JSON jsou strukturována tak, aby byla pro člověka o něco čitelnější. Ve většině případů jsou však data JSON uložena na jednom řádku, a to i bez znaku na konci řádku.
To samozřejmě není příliš vhodné pro ruční čtení a úpravy.
Tehdy je pěkný tisk užitečný. Název je zcela samozřejmý, přeformátuje text JSON tak, aby byl pro lidi čitelnější. Toto je známé jako Pěkný tisk JSON .
Analyzujte a pěkně vytiskněte JSON pomocí jq v linuxu
Data JSON lze analyzovat pomocí textových procesorů příkazového řádku, jako je awk , sed a gerp . JSON.awk je ve skutečnosti awk skript, který to dělá. Existují však některé specializované nástroje pro stejný účel.
- jq nebo jshon , JSON parser pro shell, oba jsou docela užitečné.
- Skripty prostředí jako JSON.sh nebo jsonv.sh analyzovat JSON v bash, zsh nebo dash shell.
- JSON.awk , awk skript analyzátoru JSON.
- Moduly Pythonu jako json.tool .
- podtržítko-cli , Node.js a javascript založené.
V tomto tutoriálu se zaměřuji pouze na jq , což je poměrně výkonný analyzátor JSON pro shelly s pokročilými možnostmi filtrování a skriptování.
Krásný tisk JSON
Data JSON mohou být v jednom a pro lidi téměř nečitelná, takže aby byla trochu čitelná, je zde pěkný tisk JSON.
Příklad: Údaje z jsonip.com , pro získání externí IP adresy ve formátu JSON použijte curl nebo wget nástroje jako níže.
$ wget -cq http://jsonip.com/ -O -
Skutečná data vypadají takto:
{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}
Nyní si to pěkně vytiskněte pomocí jq:
$ wget -cq http://jsonip.com/ -O - | jq '.'
Po filtrování výsledku pomocí jq by to mělo vypadat jako níže.
{ "ip": "111.222.333.444", "about": "/about", "Pro!": "http://getjsonip.com" }
Totéž lze udělat s pythonem json.tool modul. Zde je příklad:
$ cat anything.json | python -m json.tool
Toto řešení založené na Pythonu by mělo být vhodné pro většinu uživatelů, ale není tak užitečné, pokud Python není předinstalovaný nebo jej nelze nainstalovat, jako na vestavěné systémy.
Nicméně modul json.tool python má výraznou výhodu, je to multiplatformní. Můžete jej tedy bezproblémově používat na Windows, Linux nebo Mac OS.
Doporučené čtení:
- Předpisování – výstup příkazu Ping bude hezčí a snáze čitelný
Jak analyzovat JSON pomocí jq
Nejprve musíte nainstalovat jq, je již vybráno většinou distribucí GNU/Linux, nainstalujte jej pomocí příslušných příkazů instalačního programu balíčků.
Na Arch Linuxu:
$ sudo pacman -S jq
V systémech Debian, Ubuntu, Linux Mint:
$ sudo apt-get install jq
Na Fedoře:
$ sudo dnf install jq
Na openSUSE:
$ sudo zypper install jq
Pro ostatní OS nebo platformy viz oficiální instalační pokyny.
Základní filtry a identifikátory jq
jq mohl číst data JSON buď z stdin nebo soubor . V závislosti na situaci musíte použít obojí.
Jediný symbol . je nejzákladnější filtr. Tyto filtry se také nazývají index identifikátoru objektu . Pomocí jednoho . spolu s jq v podstatě pěkně vytiskne vstupní soubor JSON.
Jednoduché uvozovky - Nemusíte vždy používat jedinou uvozovku. Pokud však kombinujete několik filtrů v jednom řádku, musíte je použít.
Dvojité uvozovky - Musíte přiložit jakýkoli speciální znak, jako je @ , # , $ ve dvou dvojitých uvozovkách, jako je tento příklad, jq .foo."@bar"
Tisk nezpracovaných dat - Z jakéhokoli důvodu, pokud potřebujete pouze konečná analyzovaná data, která nejsou uzavřena v uvozovkách, použijte parametr -r s příkazem jq, jako je tento. - jq -r .foo.bar .
Analyzovat konkrétní data
Chcete-li odfiltrovat konkrétní část JSON, musíte se podívat do pěkně vytištěné datové hierarchie souboru JSON.
Příklad dat JSON z Wikipedie:
{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ], "gender": { "type": "male" } }
Tato data JSON použiji jako příklad v tomto tutoriálu, uložím to jako sample.json .
Řekněme, že chci odfiltrovat adresu ze souboru sample.json. Příkaz by tedy měl být takto:
$ jq .address sample.json
Ukázkový výstup:
{ "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }
Znovu řekněme, že chci PSČ, pak musím přidat další index identifikátoru objektu , tedy jiný filtr.
$ cat sample.json | jq .address.postalCode
Všimněte si také, že filtry rozlišují velká a malá písmena a musíte použít přesně stejný řetězec, abyste získali něco smysluplného výstupu místo null.
Analyzovat prvky z pole JSON
Prvky pole JSON jsou uzavřeny v hranatých závorkách, jejich použití je bezpochyby velmi univerzální.
Chcete-li analyzovat prvky z pole, musíte použít []identifikátor spolu s dalším identifikátorem objektu-index.
V těchto ukázkových datech JSON jsou telefonní čísla uložena uvnitř pole, abyste získali veškerý obsah z tohoto pole, musíte použít pouze hranaté závorky, jako je tento příklad.
$ jq .phoneNumber[] sample.json
Řekněme, že chcete pouze první prvek pole, pak použijte čísla objektů pole začínající 0, pro první položku použijte [0] , u dalších položek by se měl každý krok zvýšit o jednu.
$ jq .phoneNumber[0] sample.json
Příklady skriptování
Řekněme, že chci pouze číslo pro domov, ne celá data pole JSON. Zde se hodí skriptování v příkazu jq.
$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'
Zde nejprve převádím výsledky jednoho filtru do druhého, poté pomocí atributu select vyberu konkrétní typ dat a výsledek opět převádím do jiného filtru.
Vysvětlení každého typu jq filtrů a skriptování přesahuje rozsah a účel tohoto tutoriálu. Důrazně doporučujeme přečíst si níže uvedený manuál JQ pro lepší pochopení.