Table des matières


JSON Query (jq)

Cette commande est utilisée en ligne de commande pour mettre en forme du code JSON et n'afficher qu'une partie des enregistrements et/ou attributs.
Elle est particulièrement intéressante avec la commande cUrl lors d'exécution de tests en ligne de commande pour par exemple questionner une base de données, notamment via une API REST

Installation

Installer avec les droits d'administration le paquet jq

sudo apt install jq

Utilisation

Utilisation sans options.

jq fichier.json

ou en utilisant les pipes pour les commandes produisant du JSON :

curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq # curl va rendre du JSON que JQ va manipuler

On peut aussi ne récupérer qu'un attribut (dans le cas où seule une liste sans clé supérieure est retournée, sinon reportez-vous à l'exemple concret plus pas) :

jq '.[] | .mon_attribut' fichier.json

Et on peut ne prendre que certains enregistrements, par exemple, si vous avez 10 enregistrements, pour voir les données que du 3ème et 4ème :

jq '.[3:5]' fichier.json

ou des deux derniers :

jq '.[-2:]' fichier.json

si le résultat attendu ne comporte plus qu’une chaîne de caractère, l’option –raw-output (ou -r) permet de supprimer les guillemets autour :

curl https://jsonplaceholder.typicode.com/users?_limit=1 | jq -r '.[] | "\(.name)"'

ce qui peut-être utile si on récupère cette chaîne dans la variable d’un script bash

#!/bin/bash
nom_depuis_api=$(curl https://jsonplaceholder.typicode.com/users?_limit=1 | jq -r '.[] | "\(.name)"')

Exemples

Les tests utilisent l'outil en ligne de commande curl pour récupérer une réponse HTTP contenant du JSON à manipuler par JQ.

avec le serveur de test JSONPlaceholder

Pour réaliser des tests, si vous ne disposer pas de serveur REST, vous pouvez utiliser le serveur JSONPlaceholder qui propose de fausses données juste pour test,
ci-dessous récupération de 2 utilisateur (remarquer l'option _limit=2 pour limiter le nombre de retour) :

curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq

et si on ne souhaite ne récupérer que le nom auquel on concatène la ville 1) :

curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq '.[] | "\(.name) \(.address.city)"'

avec le serveur Etalab

Pour extraire, à partir de l'API REST d'Etalab, le nom d'une rue lyonnaise à partir de la chaîne professeur (et du code postal 69007), et ne récupérer que le premier retour (au cas où il y en aurait plusieurs)

curl "https://api-adresse.data.gouv.fr/search/?q=professeur&postcode=69007&limit=3" | jq '.features[0].properties.name'
# retourne :
"Rue Professeur Grignard"

avec un serveur elasticsearch exécuter sur votre poste/serveur

Autre exemple avec elasticsearch en reprenant l'exemple autour des movies :

curl "localhost:9200/_search" -X GET -H "Content-Type: application/json" -d '{"query":{"match_all": {}}}' \
 | jq '.hits.hits[] | ._source.movies.title'

avec gitlab

Récupération d'informations sur les tickets d'un projet Gitlab :

curl --header "PRIVATE-TOKEN:012-abc-345-def" "https://gitlab.com/api/v4/projects/380/issues?page=1" | jq '.[] | "\(.iid):\(.state):\(.title):\(.labels)"'

Il faut au préalable définir le token d'accès à l'API dans le projet à mettre à la place de 012-abc-345-def
récupérer le n° du projet (380 dans l'exemple ci-dessus)

Source : https://dev-tips.com/tools/using-jq-to-filter-json-output

Voir aussi


Contributeur : bcag2, Amiralgaby

1)
src pour l'interpolation de chaîne de caractères : how to get multiple values from a json array/object using jq (StackOverflow) (en)