Hur man ska Tolka JSON-Filer på Linux kommandorad med jq

0
104
Fatmawati Achmad Zaenuri/Shutterstock

JSON är en av de mest populära format för överföring av text-baserade data runt på nätet. Det finns överallt, och du är tvungen att komma över det. Vi kommer att visa dig hur man ska hantera det från Linux kommandorad med jq-kommandot.

JSON och jq

JSON står för JavaScript Object Notation. Det är ett system som gör att data kodas in filer med oformaterad text, i en självbeskrivande sätt. Det finns inga kommentarer i en JSON-fil—innehållet bör vara självförklarande. Varje värde har en textsträng som kallas ett “namn” eller “nyckel”. Detta talar om för dig vad värdet är. Tillsammans, de är kända som namn:värde-par, eller-tangenten:värde-par. Ett kolon (:) som skiljer en nyckel från dess värde.

Ett “objekt” är en samling av viktiga:värde-par. I en JSON-fil, ett objekt börjar med en öppen lockigt klammerparentes ({) och slutar med en avslutande klammerparentes (}). JSON stöder också “matriser”, som är ordnade listor med värden. En rad som börjar med en inledande hakparentes ([) och slutar med en stängning en (]).

Från dessa enkla definitioner, naturligtvis, godtycklig komplexitet kan uppstå. Till exempel objekt kan vara inkapslade i objekt. Objekt kan innehålla vektorer och matriser kan också innehålla objekt. Alla som har öppen nivåer av att bygga bo.

I praktiken, även om layouten av JSON-data är invecklad, design av data bör nog tänka om. Naturligtvis, om du inte generera JSON-data, försöker bara att använda den, du har inget att säga till om i sin layout. I dessa fall, tyvärr, du bara har att ta itu med det.

De flesta programspråk har bibliotek eller moduler som tillåter dem att tolka JSON-data. Tyvärr, Bash-skalet har ingen sådan funktion.

Nödvändigheten är uppfinningarnas moder, men, jq utility var född! Med jq, vi kan lätt tolka JSON i Bash-skalet. Och det spelar ingen roll om du har att arbeta med välutvecklade, eleganta JSON, eller saker mardrömmar är gjorda av.

Hur man Installerar jq

Vi tvungna att installera jq på alla Linux-distributioner vi att användas till forskning denna artikel.

För att installera jq på Ubuntu skriv in detta kommando:

sudo apt-get install jq

För att installera jq på Fedora, skriv in detta kommando:

sudo dnf installera jq

För att installera jq om Manjaro, skriv in detta kommando:

sudo pacman -Sy-jq

Hur man Gör JSON Läsbar

JSON inte bryr sig om “white space”, och layout påverkar inte det. Så länge de följer reglerna för JSON grammatik, system som process JSON kan läsa och förstå det. På grund av detta, JSON överförs ofta som en enkel, lång sträng, utan hänsyn till layout. Detta sparar en bit av utrymme eftersom flikar, utrymmen, och ny-line tecken behöver inte vara med i JSON. Naturligtvis, nackdelen med allt detta är att när en människa försöker att läsa den.

Låt oss dra en kort JSON-objekt från NASA: s webbplats som talar om för oss den position i den Internationella rymdstationen. Vi kommer att använda curl, vilket kan ladda ner filer att hämta JSON-objekt för oss.

Vi bryr oss inte om någon av statusmeddelanden curl vanligtvis genererar, så vi kommer att skriva följande, med-s (tyst) alternativ:

curl -s http://api.open-notify.org/iss-now.json

Nu, med lite ansträngning, kan du läsa här. Du måste plocka ut data värderingar, men det är inte lätt eller bekvämt. Låt oss upprepa det, men denna gång ska vi rör det genom jq.

jq filter används för att analysera JSON, och den enklaste av dessa filter är en punkt (.), vilket innebär att “skriva ut hela objektet.” Som standard, jq pretty-skriver ut resultatet.

Vi sätter ihop allt och skriv följande:

curl -s http://api.open-notify.org/iss-now.json | jq .

Det är mycket bättre! Nu kan vi se exakt vad som händer.

Hela objektet är insvept i klammerparenteser. Det innehåller två viktiga:namn par: meddelande och tidsstämpel. Det innehåller också ett objekt som kallas iss_position, som innehåller två viktiga:värdepar: longitud och latitud.

Vi ska försöka denna gång. Denna tid vi kommer att skriva följande, och omdirigera utdata till en fil som heter “iss.json”:

curl -s http://api.open-notify.org/iss-now.json | jq . > iss.json
katt iss.json

Detta ger oss en bra kopia av JSON-objekt på vår hårddisk.

RELATERAT: Hur att Använda curl för att Ladda ner Filer Från kommandoraden i Linux

Få Tillgång Till Uppgifter Värden

Som vi såg ovan, jq kan extrahera data värden som förs över från JSON. Det kan också arbeta med JSON lagras i en fil. Vi kommer att arbeta med lokala filer så kommandoraden är inte belamrad med curl-kommandon. Detta bör göra det lite lättare att följa.

Det enklaste sättet att hämta data från en JSON-fil är att tillhandahålla en nyckel namn för att få sin data värde. Skriv en period och viktiga namn utan ett utrymme mellan dem. Detta skapar ett filter från viktiga namn. Vi måste också tala om för jq som JSON-fil att använda.

Vi skriver följande om du vill hämta meddelandet value:

jq .meddelande iss.json

jq skriver ut texten i meddelandet värde i terminalfönstret.

Om du har en nyckel namn som innehåller blanksteg eller skiljetecken, du har att linda in sina filter i citattecken. Vård är oftast tas för att använda bokstäver, siffror och understreck så JSON viktigaste namnen är inte problematiskt.

För det första, vi skriva följande för att hämta timestamp värde:

jq .timestamp iss.json

Timestamp värde hämtas och skrivas ut i terminalfönstret.

Men hur kan vi komma åt värden inuti iss_position objekt? Vi kan använda JSON punktnotation. Vi kommer att innehålla de iss_position objekt namn i “vägen” till det centrala värdet. För att göra detta, namnet på objektet nyckeln är inne kommer att föregå kristi namn av själva nyckeln.

Vi skriver följande, inklusive latitud viktiga namn (observera att det inte finns några blanksteg mellan “.iss_position” och “.latitude”):

jq .iss_position.latitud iss.json

För att extrahera flera värden, måste du göra följande:

  • Lista de viktigaste namnen på kommandoraden.
  • Separera dem med kommatecken (,).
  • Omge dem med citattecken (“) eller apostrofer (‘).

Med detta i åtanke, vi typ följande:

jq “.iss_position.latitud .timestamp” iss.json

De två värden som utskrift till terminalfönstret.

Att arbeta med Arrayer

Låt oss ta en olika JSON-objekt från NASA.

Denna gång använder vi en lista av de astronauter som är i rymden just nu:

curl -s http://api.open-notify.org/astros.json

Okej, det fungerade, så låt oss göra det igen.

Vi kommer att skriva följande för att röret det genom jq och omdirigera den till en fil som heter “astro.json”:

curl -s http://api.open-notify.org/astros.json | jq . > astro.json

Låt oss nu skriva följande för att kontrollera våra arkiv:

mindre astro.json

Som visas nedan, ser vi nu lista av astronauter i rymden, liksom deras rymdfarkoster.

Ett JSON-objekt som innehåller en array som kallas människor. Vi vet att det är en rad på grund av den inledande hakparentes ([) (markerat i skärmbilden ovan). Det är en array av objekt som vart och ett innehåller två viktiga:värdepar: namn och hantverk.

Som vi gjorde tidigare, vi kan använda JSON punktnotation för att komma åt värdena. Vi måste också omfatta hakparenteser ([]) i namn på matrisen.

Med allt detta i åtanke, vi typ följande:

jq “.människor[].namnet” astro.json

Den här gången, alla namn värden utskrift till terminalfönstret. Vad vi frågade jq göra var att skriva ut namnet värde för varje objekt i arrayen. Ganska snyggt, va?

Vi kan hämta namnet på ett enda objekt om vi sätter sin position i matrisen i hakparenteser ([]) på kommandoraden. Matrisen använder noll-offset indexering, vilket innebär att objektet i den första positionen i arrayen är noll.

Att få tillgång till det sista objektet i den array som du kan använda -1; att få andra att sista objektet i kedjan, kan du använda -2, och så vidare.

Ibland, JSON-objekt ger antalet element i arrayen, vilket är fallet med denna. Längs med kedjan, den innehåller en nyckel:namn par uppringda numret med ett värde på sex.

Följande antal objekt i denna array:

jq “.människor[1].namnet” astro.json
jq “.personer[3].namnet” astro.json
jq “.människor[-1].namnet” astro.json
jq “.människor[-2].namnet” astro.json

Du kan även ange ett start och slut-objekt i en array. Detta kallas “slicing”, och det kan vara lite förvirrande. Kom ihåg matrisen använder en noll-offset.

För att hämta objekt från index position två, upp till (men inte inkluderande) objektet vid index position fyra, vi skriva följande kommando:

jq “.människor[2:4]” astro.json

Detta skriver ut föremål på array-index två (tredje objekt i arrayen) och tre (fjärde objekt i arrayen). Det stannar vid behandling array index fyra, som är den femte objekt i arrayen.

Vägen till bättre förståelse av detta är att experimentera på kommandoraden. Du kommer snart att se hur det fungerar.

Hur att Använda Rör med Filter

Du kan pipe output från ett filter till en annan, och att du inte måste lära dig en ny symbol. Samma som Linux kommandorad, jq använder vertikalt streck (|) för att representera ett rör.

Vi ska berätta för jq att spritsa människor matrisen till .namn-filter, som ska innehålla en lista med namnen på de astronauter i terminalfönstret.

Vi skriver följande:

jq “.människor[] | .namnet” astro.json

RELATERAT: Hur man Använder Rör på Linux

Att skapa Matriser och om Ändring av Resultat

Vi kan använda jq för att skapa nya objekt, till exempel matriser. I detta exempel kommer vi att extrahera tre värden och skapa en ny matris som innehåller dessa värden. Observera öppningen ([) och avslutande hakparentes (]) är också den första och sista tecken i string filter.

Vi skriver följande:

jq “[.iss-position.latitud, iss_position.longitud .timestamp] iss.json

Produktionen är insvept i parentes och åtskilda med kommatecken, vilket gör det till ett korrekt bildades array.

Numeriska värden kan också vara manipulerade eftersom de är hämtade. Låt oss dra timestamp från ISS position filen, och sedan packa upp det igen och ändra värdet som returneras.

Vi gör det genom att skriva följande:

jq “.timestamp” iss.json
jq “.tidsstämpel – 1570000000” iss.json

Detta är användbart om du behöver lägga till eller ta bort en standard förskjutning från en array av värden.

Låt oss skriva följande för att påminna oss om vad iss.json-filen innehåller:

jq . iss.json

Låt oss säga att vi vill bli av med meddelandet nyckel:värde-par. Det har inte något att göra med den position i den Internationella rymdstationen. Det är bara en flagga som indikerar platsen var hämtad framgångsrikt. Om det är överflödiga, vi kan avstå från det. (Du kan också bara ignorera det.)

Vi kan använda jq ta bort funktionen, del(), för att ta bort en nyckel:värde-par. För att ta bort meddelandet nyckel:värde-par, vi skriver detta kommando:

jq “del(.meddelande)” iss.json

Observera att detta inte faktiskt ta bort det från “iss.json” fil, det tar bara bort den från utgången av kommandot. Om du behöver skapa en ny fil utan message key:värde-par i den, kör kommandot, och sedan omdirigera utdata till en ny fil.

Mer Komplicerat JSON-Objekt

Låt oss hämta lite mer NASA data. Den här gången kommer vi att använda ett JSON-objekt som innehåller information om meteornedslag webbplatser från hela världen. Detta är en större fil med ett långt mer komplicerat JSON struktur än de som vi har behandlat tidigare.

Först kommer vi att skriva följande för att omdirigera den till en fil som heter “slår till.json”:

curl -s https://data.nasa.gov/resource/y77d-th95.json | jq . > strejker.json

För att se vad som JSON ser ut, vi typ följande:

mindre strejker.json

Som visas nedan, filen börjar med en inledande hakparentes ([), så hela objekt är en array. Objekt i arrayen är samlingar av nyckel:värde-par, och det är en kapslad objekt som kallas geografisk lokalisering. Den geolocation objekt innehåller ytterligare nyckel:värde-par, och en array som kallas koordinater.

Låt oss hämta namnen på meteor slår från objektet vid index position 995 genom till slutet av kedjan.

Vi kommer att skriva följande för att röret JSON genom tre filter:

jq “.[995:] | .[] | .namnet” slår till.json

Filter funktion på följande sätt:

  • .[995:]: Detta säger jq att bearbeta objekt från array index 995 genom till slutet av kedjan. Inga nummer efter kolon ( : ) är vad som berättar jq att fortsätta till slutet av kedjan.
  • .[]: Denna array iterator säger jq att behandla varje objekt i arrayen.
  • .namn: Detta filter utdrag namnet värde.

Med en liten förändring, kan vi extrahera de senaste 10 objekt från matrisen. En “-10” instruerar jq att börja bearbeta objekt 10 tillbaka från slutet av kedjan.

Vi skriver följande:

jq “.[-10:] | .[] | .namnet” slår till.json

Precis som vi har i tidigare exempel, kan vi skriva följande för att välja ett enskilt objekt:

jq “.[650].namnet” slår till.json

Vi kan också gälla skivning till strängar. Att göra så, kommer vi att skriva följande för att begära de fyra första bokstäverna i namnet på objektet på array-index 234:

jq “.[234].namn[0:4]” slår till.json

Vi kan också se ett specifikt objekt i sin helhet. Detta gör vi genom att skriva följande och innehåller en mängd index utan att någon nyckel:värde filter:

jq “.[234]” slår till.json

Om du vill se endast de värden som du kan göra samma sak utan att de viktigaste namnen.

För vårt exempel, vi skriver detta kommando:

jq “.[234][]” slår till.json

För att hämta flera värden från varje objekt vi separera dem med kommatecken i den följande kommando:

jq “.[450:455] | .[] | .namn .massa” slår till.json

Om du vill hämta kapslade värden, måste du identifiera de objekt som utgör den “väg” till dem.

Till exempel, för att referera till de koordinater värden, vi måste inkludera allomfattande array, den geolocation inkapslade objekt, och kapslade koordinater array, som visas nedan.

För att se koordinaterna värden för objektet vid index position 121 av matrisen, kan vi skriva följande kommando:

jq “.[121].geolocation.koordinater[]” slår till.json

Funktionen length

Den jq längd funktion ger olika värden beroende på vad det är tillämpats, såsom:

  • Strängar: längden av strängen i byte.
  • Objekt: antal viktiga:värde-par i objektet.
  • Matriser: antalet array-element i matrisen.

Följande kommando returnerar längden på namnet värde i 10 av de objekt som finns i JSON array, med början på index position 100:

jq “.[100:110] | .[].namn | längd” slår till.json

För att se hur många viktiga:värde-par är i första objektet i kedjan, vi skriver detta kommando:

jq “.[0] | längd” slår till.json

Nycklarna Funktion

Du kan använda knapparna funktion för att ta reda på om JSON du har att arbeta med. Det kan tala om för dig vad namnen på de nycklar som finns, och hur många föremål det finns i en array.

För att hitta nycklarna i människor objektet i “astro.json” fil, vi skriver detta kommando:

jq “.människor.[0] | nycklar” astro.json

För att se hur många element som finns i människor array, vi skriver detta kommando:

jq “.människor | nycklar” astro.json

Detta visar att det är sex, noll-offset array-element, numrerade från noll till fem.

Den har() Funktion

Du kan använda den har () – funktionen för att förhöra JSON och se om ett objekt har en viss nyckel namn. Observera den viktiga namn måste omslutas av citattecken. Vi kommer linda filter kommandot i enkla citattecken ( ” ), enligt följande:

jq ‘.[] | har(“nametype”) ” slår.json

Varje objekt i rad är markerad, så som visas nedan.

Om du vill kontrollera ett visst objekt, som du har med sitt index position i matrisen filter, som följer:

jq ‘.[678] | har(“nametype”) ” slår.json

Gå inte i Närheten av JSON Utan att Det

Den jq utility är ett perfekt exempel på den professionella, kraftfull, snabb programvara som gör levande i Linux-världen sådan glädje.

Detta var bara en kort introduktion till de vanligaste funktionerna i detta kommando—det finns en hel del mer till det. Se till att kolla in den omfattande jq manuell om du vill gräva djupare.

LÄS NÄSTA

  • “Hur man Lägger till “Flytta till” eller “Kopia till” Windows 10 Sammanhangsberoende Meny
  • “Ingen Kabel som Krävs: Hur Stream NBA All-Star Game
  • “Hur man Ställer en Standard Zoom (default Zoom-Nivå i Firefox
  • “Framtidens Telefoner: Vad Är Hopfällbar Glas?
  • “Hur man Aktiverar och Använder Fliken Grupper i Google Chrome