Hur man Arbetar Med JSON På kommandoraden

0
175

Linux har ingen inbyggd sätt att hantera JSON på rätt sätt, men många Api: er kommer att returnera JSON utgång. Här är hur man ska tolka och använda JSON data i din shell-skript med ett enkelt verktyg.

Tolkning JSON Med jq

jq är ett verktyg som kan hantera allt du vill göra med JSON. Det är super enkelt att installera, bara att ladda ner den binära och flytta den till en mapp på din VÄG, oftast i /usr/local/bin/. Det har inga beroenden, så det är bara en binär att ladda ner. Det finns nedladdningar för macOS och Windows också.

För att börja, du kan rör JSON att det till och med ganska skriva ut det. Vissa Api: er kommer att minify sina svar för att spara utrymme, vilket leder till detta hemska röran när du curl något i konsolen:

Rör den till jq så här:

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

Och det är nu läsbar, med syntax-markering för att starta upp:

Om du ger jq ett kommando, att det kommer att använda den för att markera data i JSON, mycket som hur sed fungerar på sms: a. Vi kommer att använda denna JSONPlaceholder som ett exempel API för att prova kommandon. För enkelhetens skull kommer vi att lämna ut de curl kommandot och rör för att hålla allt lättläst. Du kan också krypa till en fil och rör katt till jq, om du inte vill se curl resultat varje gång du testar ett nytt kommando.

En enkel period ‘.’ representerar data förs in i jq. Om du helt enkelt vill få en nyckel från objektet, kan du göra:

jq ‘.status”

Du kan bo här också; till exempel ‘.uppgifter.geo.host’ skulle återvända till ett värde längre ner på listan. Du kan lägga till ett frågetecken för felkontroll som “.uppgifter.geo?.host”, som anger att fastigheten är valfritt.

Att arbeta med arrayer är där jq blir intressant. Du kan använda hakparenteser för att få ett visst element i arrayen. Du kan till exempel få namnet på den första posten med:

jq ‘.[0].namnet’

Du kan segmentera matriser med [2:5], och använder samma frågetecken syntax för valfria egenskaper. Men tänk på att om en matris är tom, det betyder inte att det är en ogiltig.

Men du kommer förmodligen vill hämta en specifik post baserat på data i det, inte på order av matrisen. För att göra det, klarar hela kedjan för att den väljer du verktyget:

jq ‘.[] | välja(.namn | innehåller(“Kent”))’

Detta filter matrisen för att endast innehålla poster som klarar testet, i det här fallet är namnet på fältet innehåller ett visst namn? Detta kan vara booleskt uttryck, även aritmetiska de som väljer(.count >= 2).

Formatera JSON

jq kan konstruera JSON, vilket innebär att du kan använda den för att formatera JSON-ingång. Du kan göra objekt helt enkelt genom att linda dem i klamrar, och passera jq uttalanden som värden. jq kommer ut nya objekt. Till exempel:

katt json | jq ‘.[0] | {namn: .namn, företag: .bolaget}’

Utgångar fint till kommandoraden:

Även om detta är användbart för att strippa ut endast den information du vill ha, du kan även bygga nya objekt med hjälp av jq-kommandon.

För fullständig referens på alla jq: s syntax, kan du konsultera sin online-manualen.

Alternativ till jq

Om du inte vill använda ett annat program, kan du använda ett par alternativ. Den enklaste metoden är att avstå från att göra det i bash, och i stället använda ett skriptspråk som Python eller JavaScript (med nod) för att utföra själva behandlingen. Skulle du istället rör JSON utdata från kommandot till en fil:

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

Och sedan läsa in den till en variabel i skriptet för användning.

Du kan även använda ett enkelt sms: a val av verktyg, till exempel, om du bara behöver en särskild nyckel av ett svar, kan du använda grep vid sidan av ett reguljärt uttryck för att välja värde:

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

Men, detta kan (och kommer förmodligen) bryts väldigt lätt med förändringar i JSON. Passerar i-användare API tillbaka namnet för varje användare, men också användarnamn (som grep matchade så bra), samt namnet på företaget (som hade exakt samma knapp). Om du planerar att redogöra för alla här, ska du använda något som är medvetna om JSON struktur, snarare än att behandla det som text.