Hoe Parseren JSON-Bestanden op de Linux Command Line jq

0
604
Fatmawati Achmad Zaenuri/Shutterstock

JSON is een van de meest populaire indelingen voor het overbrengen van gegevens op basis van tekst op het web. Het is overal, en je bent gedoemd te komen over het. Wij laten u zien hoe om te gaan van de Linux commando-regel met behulp van de jq opdracht.

JSON en jq

JSON staat voor JavaScript Object Notation. Het is een regeling die het mogelijk maakt gegevens worden gecodeerd in de platte tekst bestanden, in een zelf te beschrijven manier. Er zijn geen opmerkingen in een JSON-bestand—de inhoud moet worden spreekt voor zich. Elk data-waarde een tekenreeks, een zogenaamde “naam” of “sleutel”. Dit vertelt je wat de waarde is. Samen zijn ze bekend als naam:waarde-paren, of-toets:waarde-paren. Een dubbele punt (:) scheidt een sleutel van zijn waarde.

Een “object” is een verzameling van key:waarde-paren. In een JSON-bestand, een object begint met een open accolades ({}) en eindigt met een sluitaccolade (}). JSON ondersteunt ook “arrays”, dat zijn geordende lijsten van waarden. Een array begint met een openingshaakje ([) en eindigt met het sluiten (]).

Uit deze eenvoudige definities, natuurlijk, willekeurige complexiteit kan ontstaan. Bijvoorbeeld voorwerpen kunnen worden genest binnen objecten. Objecten kunnen bevatten, matrices en arrays kunnen ook objecten bevatten. Alle van open-ended niveaus van nesten.

In de praktijk, hoewel, als de lay-out van JSON-gegevens is ingewikkeld, het ontwerp van de gegevens lay-out waarschijnlijk een te heroverwegen. Natuurlijk, als u niet het genereren van de gegevens van JSON, gewoon proberen om het te gebruiken, je hebt geen inspraak in de indeling. In die gevallen, helaas, u slechts ons hoeft te gaan.

De meeste programmeertalen hebben bibliotheken, of modules, die hen in staat stellen te ontleden JSON data. Helaas, de Bash-shell heeft geen dergelijke functionaliteit.

Noodzaak is de moeder van de uitvinding, hoewel, de jq nut was geboren! Met jq, kunnen we gemakkelijk ontleden JSON in de standaard Bash shell. En het maakt niet uit of u moet werken met een goed ontworpen, elegante JSON, of de spullen nachtmerries van gemaakt zijn.

Hoe te Installeren jq

We hadden te installeren jq op alle Linux distributies hebben we gebruikt om het onderzoek in dit artikel.

Te installeren jq op Ubuntu typ de volgende opdracht:

sudo apt-get install jq

Te installeren jq op Fedora, typ de volgende opdracht:

sudo dnf installeren jq

Te installeren jq op Manjaro, typ de volgende opdracht:

sudo pacman -Sy jq

Hoe Maak JSON Leesbaar

JSON is niet de zorg over de witte ruimte, en de lay-out niet van invloed. Zo lang als het volgt de regels van JSON grammatica, systemen die het proces JSON kunnen worden gelezen en begrepen. Vanwege dit, JSON wordt vaak doorgegeven als een eenvoudige, lange string, zonder enige overweging van de lay-out. Dit bespaart ruimte, omdat tabs, spaties en het nieuwe-lijn tekens niet worden opgenomen in de JSON. Natuurlijk, het nadeel van dit alles is als een mens probeert om het te lezen.

Laten we trekken een korte JSON-object van de NASA-site, dat vertelt ons de positie van het International Space Station. We zullen gebruik maken van krullen, die kan downloaden bestanden op te halen van de JSON-object voor ons.

We hoeven niet de zorg over een van de berichten over de status van krullen meestal genereert, dus we zullen typ de volgende, met behulp van de -s (stille) optie:

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

Nu, met een beetje moeite kunt u dit lezen. U moet kiezen uit de waarden, maar het is niet makkelijk of handig. Laten we dit herhalen, maar deze keer zullen we pijp door jq.

jq filters gebruikt voor het parseren van JSON, en de eenvoudigste van deze filters is een punt (.) wat betekent “afdrukken van het gehele object.” Standaard jq vrij-hiermee wordt de uitvoer.

We zetten het allemaal samen en typ het volgende:

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

Dat is veel beter! We kunnen nu precies zien wat er gaande is.

Het gehele object is verpakt in accolades. Het bevat twee key:naam paren: bericht en tijdstempel. Het bevat een object met de naam iss_position bevat twee key:waarde-paren: longitude en latitude.

We zullen proberen dit eens te meer. Deze keer zullen we typt u het volgende en omleiden naar een bestand met de naam “iss.json”:

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

Dit geeft ons een goed aangelegd kopie van de JSON-object op onze harde schijf.

GERELATEERD: Hoe te Gebruiken krullen om Bestanden te Downloaden Van de Linux Commando-Regel

Toegang Tot Gegevenswaarden

Zoals we hierboven zagen, jq kan halen gegevens waarden worden doorgesluisd via JSON. Het kan ook werken met JSON opgeslagen in een bestand. We gaan werken met lokale bestanden, zodat de commando-regel is niet vol met krullen opdrachten. Dit maakt het een beetje makkelijker te volgen.

De eenvoudigste manier om gegevens te extraheren uit een JSON-bestand te voorzien van een naam is voor het verkrijgen van gegevens waarde. Typ een periode en de naam van de sleutel zonder een spatie ertussen. Dit maakt een filter van de naam van de sleutel. We moeten ook vertellen jq die JSON-bestand te gebruiken.

We typt u het volgende voor het ophalen van de waarde bericht:

jq .bericht iss.json

jq hiermee drukt u de tekst van het bericht waarde in het terminal-venster.

Als u een sleutel naam met spaties of leestekens, je moet wikkel het filter tussen aanhalingstekens. Zorg gewoonlijk wordt genomen om het gebruik van letters, cijfers en onderstrepingstekens alleen dus de JSON-toets namen zijn niet problematisch.

Ten eerste, we typt u het volgende voor het ophalen van een tijdstempel waarde:

jq .tijdstempel van het iss.json

De timestamp waarde wordt opgehaald en afgedrukt in het terminal-venster.

Maar hoe kunnen we toegang krijgen tot de waarden in de iss_position object? We kunnen gebruik maken van de JSON-dot-notatie. We zijn de iss_position de naam van het object in het “pad” naar de waarde van de sleutel. Om dit te doen, de naam van het object waar de sleutel in gaat vooraf aan de naam van de toets zelf.

Wij typ de volgende, met inbegrip van de breedtegraad van de naam van de sleutel (opmerking er zijn geen spaties tussen “.iss_position” en “.breedte”):

jq .iss_position.latitude iss.json

Uitpakken van meerdere waarden, moet u het volgende doen:

  • Een lijst met de belangrijkste namen op de commando-regel.
  • Scheidt je ze met komma ‘ s (,).
  • Ze plaatst tussen aanhalingstekens (“) of enkele (‘).

Met dat in het achterhoofd, zijn wij het volgende te typen:

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

De twee waarden print naar het terminal venster.

Het werken met Arrays

Laten we grijpen een andere JSON-object van de NASA.

Deze tijd gebruiken we een lijst van de astronauten die in de ruimte zijn nu:

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

Oké, dat werkte, dus laten we het opnieuw doen.

Typ het volgende om de buis door jq en doorsturen naar een bestand met de naam “astro.json”:

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

Laten we nu typt u het volgende te controleren bestand:

minder astro.json

Zoals hieronder weergegeven, zien we nu de lijst van astronauten in de ruimte, evenals hun raketten.

Dit JSON-object bevat een array genaamd people. We weten dat het een array vanwege het haakje openen ([) (gemarkeerd in de bovenstaande schermafbeelding). Het is een array van objecten die bevatten elk twee key:waarde-paren: de naam en het ambacht.

Zoals we eerder gedaan hebben, kunnen we gebruik maken van de JSON-dot-notatie om toegang te krijgen tot de waarden. We moeten ook de haken ([]) in de naam van de array.

Met dat in het achterhoofd, zijn wij het volgende te typen:

jq “.mensen[].de naam” astro.json

Deze keer, de waarden voor de naam van print naar het terminal venster. Wat we gevraagd jq te doen was afdrukken van de waarde van de naam voor elk object in de matrix. Best netjes toch?

We kunnen het ophalen van de naam van een enkel object, als we de positie in de array in de vierkante haken ([]) op de commando-regel. De matrix maakt gebruik van ‘ zero-offset indexeren, wat betekent dat het object in de eerste positie van de matrix gelijk is aan nul.

Om toegang te krijgen tot het laatste object in de matrix kunt u gebruik maken van -1; het tweede tot het laatste object in de matrix kunt u gebruik maken van -2, enzovoort.

Soms, de JSON-object geeft het aantal elementen in de matrix, dat is het geval bij deze. Samen met de matrix, het bevat een key:naam pair genoemd getal met een waarde van zes.

De volgende objecten zijn in deze matrix:

jq “.mensen[1].de naam” astro.json
jq “.mensen[3].de naam” astro.json
jq “.mensen[-1].de naam” astro.json
jq “.mensen[-2].de naam” astro.json

U kunt ook een begin-en eind-object in de matrix. Dit is de zogenaamde “snijden”, en het kan een beetje verwarrend. Vergeet niet de array maakt gebruik van een nul-offset.

Voor het ophalen van de objecten uit de index positie twee, tot aan (maar niet inclusief) de object index op plaats vier, typt u de volgende opdracht:

jq “.mensen[2:4]” astro.json

Hiermee kunt u de objecten op de array-index van twee (het derde object in de matrix) en drie (de vierde object in de matrix). Het stopt de verwerking op de array-index van vier, die de vijfde object in de matrix.

De manier om beter te begrijpen is om te experimenteren op de commando-regel. Je zult al snel zien hoe het werkt.

Het Gebruik van Buizen met Filters

U kunt de pijp van de uitvoer van een filter aan een ander, en je hoeft niet te leren van een nieuw symbool. Hetzelfde als de Linux command line, jq gebruik maakt van de verticale balk (|) om het vertegenwoordigen van een pijp.

We vertellen jq aan de pijp van de mensen array in de .naam van het filter, waardoor u een lijst met de namen van de astronauten in het terminal venster.

We typt u het volgende:

jq “.mensen[] | .de naam” astro.json

GERELATEERD: Hoe te Gebruiken aanbrengen op Linux

Het maken van Arrays en Wijzigen van Resultaten

We kunnen gebruik maken van jq nieuwe objecten maken, zoals arrays. In dit voorbeeld zullen we extract drie waarden en het maken van een nieuwe matrix met die waarden. Opmerking het openen ([) en haakje sluiten (]) zijn ook de eerste en de laatste tekens in de tekenreeks van het filter.

We typt u het volgende:

jq “[.iss-positie.latitude, iss_position.breedtegraad .timestamp]” iss.json

De uitgang wordt gewikkeld tussen haakjes en gescheiden door komma ‘ s, waardoor het een goed gevormde matrix.

Numerieke waarden kunnen ook worden bewerkt als ze worden opgehaald. Laten we trekken de tijdstempel van het ISS positie bestand en pak het weer op en wijzig de waarde die wordt geretourneerd.

Om dit te doen, typt u het volgende:

jq “.timestamp” iss.json
jq “.timestamp – 1570000000” iss.json

Dit is handig als u wilt toevoegen of verwijderen van een standaard offset uit een matrix van waarden.

Laat typ het volgende om ons eraan te herinneren wat het iss.json-bestand bevat:

jq . iss.json

Laten we zeggen dat we willen om zich te ontdoen van de toets boodschap:waarde-paar. Dat heeft niets te maken met de positie van het International Space Station. Het is gewoon een vlag die aangeeft de locatie was opgehaald. Als het overschot aan de eisen, we kunnen vrijstelling. (Je zou ook gewoon negeren.)

We kunnen gebruik maken van jq delete functie, del(), om een toets te verwijderen:waarde-paar. Om het bericht te verwijderen key:waarde paar, wij typ de volgende opdracht:

jq “del(.bericht)” iss.json

Let op: dit geldt niet daadwerkelijk te verwijderen van de “iss.json” bestand; slechts verwijdert uit de uitvoer van de opdracht. Als u een nieuw bestand maken zonder de toets boodschap:waarde-paar in, voer het commando en leid de uitgang in een nieuwe bestand.

Meer Gecompliceerde JSON Objecten

We halen wat meer NASA-gegevens. Deze tijd gebruiken we een JSON-object bevat informatie over de meteorietinslag sites uit de hele wereld. Dit is een groter bestand met een veel ingewikkelder JSON structuur dan die we hebben gedeeld met eerder.

Eerst zullen we typt u de volgende omleiden naar een bestand met de naam “stakingen.json”:

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

Om te zien wat JSON eruit ziet, typen we het volgende:

minder stakingen.json

Zoals hieronder weergegeven, is het bestand begint met een openingshaakje ([), zodat het gehele object is een array. De objecten in de matrix zijn verzamelingen van key:waarde-paren, en er is een geneste object met de naam van geolocatie. Met de geolocatie object bevat aanvullende toets:waarde-paren, en een array genaamd coördinaten.

Laten we het ophalen van de namen van de meteoor inslagen van het object index positie van 995 tot het einde van de array.

Typ het volgende om de pijp van de JSON door drie filters:

jq “.[995:] | .[] | .de naam” stakingen.json

De filters van de functie op de volgende manieren:

  • .[995:]: Dit vertelt jq voor het verwerken van de objecten uit de array-index van 995 tot het einde van de array. Geen cijfer achter de dubbele punt ( : ) is wat vertelt jq te blijven tot het einde van de array.
  • .[]: Deze array iterator vertelt jq voor het verwerken van elk object in de matrix.
  • .naam: Dit filter haalt de waarde van naam.

Met een kleine verandering, kunnen we halen de laatste 10 objecten uit de array. Een “-10” instrueert jq om te beginnen met het verwerken van objecten 10 terug vanaf het einde van de array.

We typt u het volgende:

jq “.[-10:] | .[] | .de naam” stakingen.json

Net zoals we in de voorgaande voorbeelden, we kunnen typ de volgende selecteert u een enkel object:

jq “.[650].de naam” stakingen.json

We kunnen ook van toepassing snijden tot strings. Om dit te doen, zullen wij typ de volgende aanvraag de eerste vier letters van de naam van het object op de array-index 234:

jq “.[234].naam[0:4]” stakingen.json

We kunnen ook een specifiek object in zijn geheel. Om dit te doen, typt u het volgende en voorzien van een array-index zonder een toets:de waarde filters:

jq “.[234]” stakingen.json

Als u wilt zien alleen de waarden, kunt u hetzelfde doen zonder de namen van de toetsen.

Voor ons voorbeeld hebben we dit commando:

jq “.[234][]” stakingen.json

Voor het ophalen van meerdere waarden van elk object, we scheiden met komma ‘ s in de volgende opdracht:

jq “.[450:455] | .[] | .naam, .massale stakingen.json

Als u wilt ophalen geneste waarden, moet u de objecten te identificeren die het “pad” naar hen.

Bijvoorbeeld, verwijzen naar de coördinaten waarden, die we hebben om de allesomvattende array, met de geolocatie van het geneste object, en de geneste coördinaten matrix, zoals hieronder weergegeven.

Om de coördinaten waarden voor het object op positie index 121 van de reeks, typt u de volgende opdracht:

jq “.[121].geolocation.coördinaten[]” stakingen.json

De lengte van de Functie

De jq lengte functie geeft verschillende statistieken op basis van wat het is toegepast, zoals:

  • Snaren: De lengte van de tekenreeks in bytes.
  • Objecten: Het aantal key:waarde-paren in het object.
  • Arrays: Het aantal array-elementen in de array.

De volgende opdracht geeft de lengte van de naam van de waarde in 10 van de objecten in de JSON array, te beginnen bij de positie index 100:

jq “.[100:110] | .[].naam | lengte” stakingen.json

Om te zien hoeveel key:waarde-paren in de eerste object in de matrix, wij typ de volgende opdracht:

jq “.[0] | lengte” stakingen.json

De Functie van de toetsen

U kunt gebruik maken van de functie van de toetsen om uit te vinden over de JSON heb je om te werken met. Het kan u vertellen wat de namen van de toetsen, en hoeveel objecten er zijn in een matrix.

Om de sleutels te vinden in de mensen object in de “astro.json” bestand, typt u deze opdracht:

jq “.de mensen.[0] | toetsen” astro.json

Om te zien hoe veel elementen zijn in de mensen array, wij typ de volgende opdracht:

jq “.mensen | toetsen” astro.json

Dit toont aan dat er zes, nul-offset array-elementen genummerd van nul tot vijf.

Het is() Functie

U kunt gebruik maken van de is() de functie voor het ondervragen van de JSON en te zien of een object heeft een bepaalde naam. Opmerking de naam van de sleutel moet worden verpakt in aanhalingstekens. We wikkel het filter opdracht in enkele aanhalingstekens (‘), als volgt:

jq ‘.[] | heeft(“nametype”) ” stakingen.json

Elk object in de matrix is gecontroleerd, zoals hieronder weergegeven.

Als u wilt controleren of een bepaald object, kunt u ook de index van de positie in de array filter, als volgt:

jq ‘.[678] | heeft(“nametype”) ” stakingen.json

Ga niet in de Buurt van JSON Zonder Het

De jq utility is het perfecte voorbeeld van de professionele, snelle en krachtige software dat maakt het leven in de Linux-wereld een plezier.

Dit was slechts een korte inleiding tot de algemene functies van deze opdracht—er is een heleboel meer te bieden. Controleer de uitgebreide jq handleiding als je dieper wil graven.

LEES VERDER

  • “Het Toevoegen van “Verplaatsen naar” of “Kopiëren naar” Windows 10 Context Menu
  • “Geen Kabel Nodig: Hoe om te Streamen van de NBA All-Star Game
  • “Het Instellen van een Standaard Zoom-Niveau in Firefox
  • “De Toekomst van de Telefoons: Wat Is Opvouwbaar Glas?
  • “Hoe u het Tabblad Groepen in Google Chrome