Skip to main content
Image de couverture pour Commandes utiles avec Jq

Commandes utiles avec Jq

Lorsqu’on veut manipuler du JSON dans son terminal, la commande Jq devient indispensable

Exemple de json “inline”

{"message": "success", "timestamp": 1618312570, "iss_position": {"longitude": "104.5549", "latitude": "9.1914"}}
echo $JSON | jq '.' 

La réponse formatée avec identation

{
  "message": "success",
  "timestamp": 1618312570,
  "iss_position": {
    "longitude": "104.5549",
    "latitude": "9.1914"
  }
}

Réponse Json via Curl

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

Pour récupérer un champ de 1er niveau, il suffit de préfixer le nom du champ par un .

curl http://api.open-notify.org/iss-now.json | jq '.timestamp'
1618312570

Pour récupérer un champ de 2eme niveau, on chaine les appels

curl http://api.open-notify.org/iss-now.json | jq '.iss_position.latitude'
"9.1914"

Exemple de données issues du site de la Nasa via http://api.open-notify.org/astros.json

{
  "message": "success",
  "number": 10,
  "people": [
    {
      "craft": "ISS",
      "name": "Sergey Ryzhikov"
    },
    {
      "craft": "ISS",
      "name": "Kate Rubins"
    },
    {
      "craft": "ISS",
      "name": "Sergey Kud-Sverchkov"
    },
    {
      "craft": "ISS",
      "name": "Mike Hopkins"
    },
    {
      "craft": "ISS",
      "name": "Victor Glover"
    },
    {
      "craft": "ISS",
      "name": "Shannon Walker"
    },
    {
      "craft": "ISS",
      "name": "Soichi Noguchi"
    },
    {
      "craft": "ISS",
      "name": "Mark Vande Hei"
    },
    {
      "craft": "ISS",
      "name": "Oleg Novitskiy"
    },
    {
      "craft": "ISS",
      "name": "Pyotr Dubrov"
    }
  ]
}

Pour récupérer le tableau des personnes

curl http://api.open-notify.org/astros.json | jq '.people'

Pour lister le nom de chacune des personnes

Option 1 : en refirigeant la sortie Json de la commande jq vers une autre commande jq

curl http://api.open-notify.org/astros.json | jq '.people[]' | jq '.name'

.people[] renvoie les éléments dans le tableau, pas le tableau

Option 2 : en une commande

curl http://api.open-notify.org/astros.json | jq '.people[].name'

Récupérer le nom des 3 premières personnes

curl http://api.open-notify.org/astros.json | jq '.people[:3]' | jq '.[].name'

on renvoie un tableau avec les 3 premiers élements

Compter les personnes

curl http://api.open-notify.org/astros.json | jq '.people | length'

Lister les clés de la réponse

curl http://api.open-notify.org/astros.json | jq '. | keys'

Manipuler les valeurs avec map

echo '[12,14,15]' | jq 'map(.-2)'
[
  10,
  12,
  13
]

curl http://api.open-notify.org/astros.json | jq '.people[:3] | .[] | ({username: .name, length: (.name | length) })'
{
  "username": "Sergey Ryzhikov",
  "length": 15
}
{
  "username": "Kate Rubins",
  "length": 11
}
{
  "username": "Sergey Kud-Sverchkov",
  "length": 20
}

Récupérer les personnes dont le nom commence par “S”

curl http://api.open-notify.org/astros.json | jq '.people[] | select(.name | test("S."))'

La documentation officielle de Jq regorge d’exemples.
Jq est une librairie puissante dont on peut difficilement se passer lorsqu’on traite avec des API en ligne de commande.