jq json
jq permet de lire, filtrer et transformer du JSON depuis la ligne de commande.
Installation
1
2
3
4
5
# Debian/Ubuntu
sudo apt install jq
# macOS
brew install jq
Lire un fichier JSON
Avec data.json :
1
2
3
4
5
{
"nom": "Alice",
"age": 30,
"roles": ["admin", "user"]
}
Afficher tout le contenu :
1
jq . data.json
Afficher une propriété :
1
jq '.nom' data.json
Résultat :
1
"Alice"
Afficher la valeur sans les guillemets :
1
jq -r '.nom' data.json
Résultat :
1
Alice
Afficher plusieurs propriétés :
1
jq '{nom: .nom, age: .age}' data.json
Parcourir un tableau
Pour ce JSON :
1
2
3
4
5
6
{
"utilisateurs": [
{"nom": "Alice", "age": 30},
{"nom": "Bob", "age": 25}
]
}
Afficher les noms :
1
jq -r '.utilisateurs[].nom' data.json
Filtrer les utilisateurs de plus de 25 ans :
1
jq '.utilisateurs[] | select(.age > 25)' data.json
Afficher uniquement leur nom :
1
jq -r '.utilisateurs[] | select(.age > 25) | .nom' data.json
Parser la sortie d’une commande
1
curl -s https://api.example.com/users | jq '.users[] | .name'
Avec une variable shell :
1
2
3
JSON='{"nom":"Alice","age":30}'
echo "$JSON" | jq -r '.nom'
Transformer les données
Créer une nouvelle structure :
1
jq '.utilisateurs[] | {nom: .nom, majeur: (.age >= 18)}' data.json
Compter les éléments :
1
jq '.utilisateurs | length' data.json
Trier :
1
jq '.utilisateurs | sort_by(.age)' data.json
Extraire les noms dans un tableau :
1
jq '[.utilisateurs[].nom]' data.json
Valeurs par défaut et champs optionnels
Éviter une erreur si un champ est absent :
1
jq '.email // "email inconnu"' data.json
Accéder à un champ imbriqué :
1
jq '.adresse.ville' data.json
Avec l’opérateur optionnel :
1
jq '.adresse?.ville' data.json
Les opérateurs essentiels sont :
.champ: accéder à une propriété ;.tableau[]: parcourir un tableau ;select(...): filtrer ;|: enchaîner des opérations ;-r: produire du texte brut ;//: fournir une valeur par défaut ;length: compter ou mesurer ;map(...): transformer les éléments d’un tableau.
Par exemple, une commande fréquente est :
1
jq -r '.results[] | select(.active == true) | .name' data.json