Commandes utiles avec Jq

Publié le

illustration de l'article

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

Formater un Json

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 '.'

Récupérer uniquement certains champs

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"

Manipuler des tableaux

Récupérer un tableau

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'

Limiter les champs retournés

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'

Limiter les nombre de lignes et champs retournés

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

Fonctions internes

Récupérer la longueur d’un tableau

Compter les personnes

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

Récupérer uniquement les clés d’un tableau

Lister les clés de la réponse

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

Modifier les valeurs avec une fonction

Manipuler les valeurs avec map

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

Recréer des valeurs

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
}

Filtrer avec des Regex

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."))'

Pour aller plus loin

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.

#jq #outils

D'autres articles à lire