Hoe te Werken Met JSON Op de Commando-Regel

0
173

Linux heeft geen ingebouwde manier om JSON goed, nog veel Api ‘ s terug JSON output. Hier is hoe het te ontleden en te gebruiken JSON-gegevens binnen de shell-scripts met een eenvoudig hulpprogramma.

Het parseren van JSON Met jq

jq is een programma dat kan omgaan met alles wat u wilt doen met JSON. Het is super eenvoudig te installeren, gewoon downloaden van de binaire en verplaats het naar een map op uw PAD, meestal /usr/local/bin/. Het heeft geen afhankelijkheden, dus het is gewoon een binaire te downloaden. Er zijn downloads voor mac os en Windows.

Om te beginnen, kunt u de pijp JSON om het te pretty-printen. Sommige Api ‘ s zullen kleineren en hun reacties om ruimte te besparen, waardoor deze vreselijke puinhoop wanneer je krullen iets in de console:

De pijp aan jq zo:

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

En het is nu leesbaar, met syntax highlighting om op te starten:

Als je jq van een opdracht, zullen deze gebruiken om gegevens te selecteren uit de JSON, net als hoe sed werkt op de tekst. We gebruiken deze JSONPlaceholder als voorbeeld API uit te proberen commando ‘ s. Ter wille van de eenvoud laten we de krullen opdracht en de buis om alles leesbaar. U kunt ook krullen naar een bestand en pijp kat jq, als u niet wilt dat om de krullen output elke keer dat u aan het testen van een nieuwe opdracht.

Een eenvoudige periode ‘.’ vertegenwoordigt de gegevens doorgesluisd naar jq. Als je gewoon wilt een sleutel te krijgen van het object, kunt u dit doen:

jq ‘.status’

U kunt dit nest; bijvoorbeeld, ‘.de gegevens.geo.host’ zou een waarde retourneren verder omlaag in de lijst. Optioneel, kunt u een vraagteken voor foutcontrole als “.de gegevens.geo?.host”, die bepaalt dat het eigendom is optioneel.

Het werken met arrays is waar jq wordt interessant. U kunt gebruik vierkante haken om een specifieke array-element. Bijvoorbeeld, kan je de naam van het eerste item met:

jq ‘.[0].de naam’

U kunt snijd arrays met [2:5], en gebruiken dezelfde vraag teken syntaxis voor optionele eigenschappen. Maar houd in gedachten dat als een array leeg is, betekent niet dat het een ongeldige eigenschap.

Echter, zult u waarschijnlijk wilt ophalen voor een specifiek item op basis van de gegevens in het bestand, niet op de orde van de matrix. Om dat te doen, geef je de hele array te selecteren utility:

jq ‘.[] | selecteren(.naam | bevat(“Leanne”))’

Deze filters de matrix alleen de items die de test; in dit geval wordt de naam van het veld met een bepaalde naam? Dit kan een boolese expressie, zelfs de rekenkunde zoals selecteren(.count >= 2).

Het opnieuw formatteren van JSON

jq kunnen bouwen JSON, wat betekent dat u kunt gebruiken voor het opnieuw formatteren van JSON-ingang. U kunt objecten gewoon door het te verpakken ze in accolades en doorgeven jq verklaringen als de waarden. jq zal de uitvoer van het nieuwe object. Bijvoorbeeld:

kat json | jq ‘.[0] | {naam: .naam bedrijf: .company}’

Uitgangen mooi aan de commando-regel:

Hoewel dit is handig voor het verwijderen van alleen de informatie die u wilt, kunt u ook de bouw van nieuwe objecten met behulp van de jq opdrachten.

Voor de volledige referentie op alle jq ‘ s syntaxis, kunt u de online handleiding.

Alternatieven voor jq

Als u geen gebruik wilt maken van een ander programma, kunt u gebruik maken van een paar alternatieven. De eenvoudigste methode is het afzien van het doen van het in bash, en in plaats daarvan gebruik van een scripttaal zoals Python of JavaScript (met knoop) om de eigenlijke verwerking. U zou in plaats daarvan de pijp van de JSON-commando-uitvoer naar een bestand:

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

En vervolgens geladen in een variabele binnen het script voor gebruik.

U kan ook gebruik maken van eenvoudige tekst-selectie hulpprogramma ‘ s; bijvoorbeeld, als u gewoon behoefte aan een specifieke toets van een reactie, dan kunt u gebruik grep naast een reguliere expressie om de waarde te selecteren:

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

Echter, dit kan (en waarschijnlijk zal) breken zeer gemakkelijk met eventuele wijzigingen in de JSON. Passeren in de gebruikers-API keerde de naam van elke gebruiker, maar ook de gebruikersnaam (die grep afgestemd als het goed is), evenals de naam van het bedrijf (die had exact dezelfde sleutel). Tenzij je van plan bent om rekening te houden met alle van deze, moet u gebruik maken van iets dat op de hoogte is van de JSON structuur, in plaats van te behandelen als tekst.