{{tag>console}}
----
====== JSON Query (jq) ======
Cette commande est utilisée en [[:tutoriel/console_ligne_de_commande|ligne de commande]] pour mettre en forme du code [[wpfr>JavaScript_Object_Notation|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 [[:CLI|ligne de commande]] pour par exemple questionner une base de données, notamment via une **API REST**
===== Installation =====
Installer avec les [[:sudo|droits d'administration]] le paquet **[[apt>jq]]**
sudo apt install jq
===== Utilisation =====
Utilisation sans options.
jq fichier.json
ou en utilisant [[:projets:ecole:scripting:initiation_au_shell#les_pipes|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 [[https://jsonplaceholder.typicode.com|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 ((src pour l'interpolation de chaîne de caractères : [[https://stackoverflow.com/a/71964370/6614155|how to get multiple values from a json array/object using jq (StackOverflow)]] **(en)**)) :
curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq '.[] | "\(.name) \(.address.city)"'
==== avec le serveur Etalab ====
Pour extraire, à partir de l'[[https://adresse.data.gouv.fr/api-doc/adresse|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 =====
* (en) [[https://github.com/dominictarr/JSON.sh|parser JSON.sh]] pour "aplatir" une sortie JSON
* (en) [[https://dev-tips.com/tools/using-jq-to-filter-json-output]]
----
//Contributeur : [[:utilisateurs/bcag2]], [[:utilisateurs/Amiralgaby]]//