Dateien im JSON-Format kann man sich auf dem Terminal zwar einfach ausgeben, sie dann aber auch oft nicht mehr so einfach lesen oder damit arbeiten. Heute stellen wir euch in diesem Türchen das erste Mal ein cooles Tool vor! Und zwar “jq”. Jq kann auf dem Terminal genutzt werden um nicht nur JSON-Strings super easy und schön auszugeben, sondern auch noch spezifische Daten aus diesem rauszuziehen. Das alles federleicht auf dem Terminal, ohne das JSON-Objekt in irgendeine JavaScript oder PHP Anwendung rein laden zu müssen.
Die Installation
Mit Zero Install:
0install add jq https://apps.0install.net/utils/jq.xml
Oder MacOS mit Homebrew:
brew install jq
Die Installation überprüfen indem ihr einfach “jq” eingebt und folgendes sehen solltet:
jq - commandline JSON processor [version 1.6]
Usage: jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter>
[JSON_TEXTS ... ]
JSON-Strings schön ausgeben
Eine der einfachsten Anwendungsfälle ist das schöne Ausgeben eines JSON-Strings, damit man ihn im Terminal eben überfliegen und ggf. prüfen kann. Dazu können wir einen String in jq pipen, gleich eine ganze Datei oder sogar die Antwort einer API Anfrage:
# Ein JSON per "echo" in jq pipen
$ echo '{"item":{"name":"Fairer Gewürz-Adventskalender","description":"mit 24 verschiedenen [...]","price":99, "special_price": 79.99}}' | jq '.'
# Direkt auf einer JSON-Datei anwenden
$ jq '.' items.json
{
"item": {
"name": "Fairer Gewürz-Adventskalender"
"description": "mit 24 verschiedenen [...]"
"price": 99,
"special_price": 79.99
}
}
# Bei der Antwort einer API Anfrage anwenden
$ curl http://headers.jsontest.com/ | jq '.'
{
"X-Cloud-Trace-Context": "...",
"Accept": "...",
[...]
}
Zeugreifen auf bestimmte Knoten
Wenn ein JSON viel zu lang ist und man etwas bestimmtes prüfen muss, will man sich teilweise auch nur bestimmte Knoten aus einem multidimensionalem JSON ausgeben. Dafür bietet jq auch sehr coole Möglichkeiten:
<#
items.json:
{
"item": {
"name": "Fairer Gewürz-Adventskalender",
"description": "mit 24 verschiedenen [...]",
"price": 99,
"special_price": 79.99
}
}
#>
# Ausgabe von dem Knoten "item"
$ jq '.item' items.json
# Ergebnis:
{
"name": "Fairer Gewürz-Adventskalender",
"description": "mit 24 verschiedenen [...]",
[...]
}
# Ausgabe von dem Wert von "item.name" und
# zusätzlich auch "item.price"
$ jq '.item.name, .item.price' items.json
# Ergebnis:
"Fairer Gewürz-Adventskalender"
99
JSON-Arrays handlen
Neben JSON-Objekten, die wir im letzten Abschnitt benutzt haben, kann man auch sehr simple mit Arrays umgehen:
<#
items.json:
[
{
"sku": "001",
"name": "Quinoaflocken",
"price": 3.5
},
{
"sku": "002",
"name": "Langkornreis",
"price": 2.9
}
]
#>
# Abrufen der SKU von jedem Array Eintrag
$ jq '.[].sku' items.json
# Ergebnis:
"001"
"002"
# Abrufen der SKU vom Eintrag mit Index 1
$ jq '.[1].sku' items.json
# Ergebnis:
"002"
Einblick: Coole Funktionen
Neben einfachen Ausgaben gibt es aber echt noch einige, coole andere Funktionen von jq. Besondere Ausgaben, Validierungen und sogar das manipulieren eines JSONs in diesem Abschnitt:
<#
items.json:
{
"item": {
"sku": "001",
"name": "Quinoaflocken",
"description": "kbA, 250 g",
"price": 3.5,
"special_price": 1.5
}
}
#>
# Ausgeben aller Keys des Knotens "item"
$ jq '.item | keys' items.json
[
"description",
"name",
"price",
"sku",
"special_price"
]
# Die Länge der Array-Knotens "item"
$ jq '.item | length' items.json
5
# Die Länge des Strings "item.name"
$ jq '.item.name | length' items.json
13
# Prüfen, ob bestimmte Knoten vorhanden sind
$ jq 'map(has("sku","shipping"))' items.json
[
true,
false
]
# Bestimmte Knoten aus dem JSON löschen
$ jq 'del(.item.description)' items.json
{
"item": {
"sku": "001",
"name": "Quinoaflocken",
"price": 3.5,
"special_price": 1.5
}
}
Wenn euch jq genauso beeindruckt hat wie uns und ihr mehr wissen wollt, guckt gerne auf der offiziellen GitHub-Page vorbei: https://jqlang.github.io/jq/