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.