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