Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
json_query [Le 26/07/2023, 12:24] bcag2 [Exemples] ajout JSONPlaceholder, restructuration des exples |
json_query [Le 05/01/2025, 23:10] (Version actuelle) Amiralgaby correction et syntaxe d'option |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>console BROUILLON}} | + | {{tag>console}} |
---- | ---- | ||
Ligne 6: | Ligne 6: | ||
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.\\ | 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** | + | 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 ===== | ===== Installation ===== | ||
- | Installer avec les [[:sudo|droits d'administration]] le paquet jq | + | Installer avec les [[:sudo|droits d'administration]] le paquet **[[apt>jq]]** |
<code bash> | <code bash> | ||
- | apt install jq | + | sudo apt install jq |
</code> | </code> | ||
===== Utilisation ===== | ===== Utilisation ===== | ||
- | On peut l'utiliser simplement : | + | Utilisation sans options. |
<code bash> | <code bash> | ||
- | curl service:<port>/<table_ou_vue> | jq | + | jq fichier.json |
</code> | </code> | ||
+ | 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) : | + | 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 bas) : |
<code bash> | <code bash> | ||
- | curl service:<port>/<table_ou_vue> | jq '.[] | .mon_attribut' | + | jq '.[] | .mon_attribut' fichier.json |
</code> | </code> | ||
- | 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 : | + | Et on peut ne prendre que certains enregistrements, par exemple, si vous avez 10 enregistrements, pour voir les données que du 3<sup>ème</sup> et 4<sup>ème</sup> : |
<code bash> | <code bash> | ||
- | curl service:<port>/<table_ou_vue> | jq '.[3:5]' | + | jq '.[3:5]' fichier.json |
</code> | </code> | ||
ou des deux derniers : | ou des deux derniers : | ||
<code bash> | <code bash> | ||
- | curl service:<port>/<table_ou_vue> | jq '.[-2:]' | + | jq '.[-2:]' fichier.json |
</code> | </code> | ||
+ | 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 : | ||
+ | <code bash>curl https://jsonplaceholder.typicode.com/users?_limit=1 | jq -r '.[] | "\(.name)"'</code> | ||
+ | ce qui peut-être utile si on récupère cette chaîne dans la variable d’un script bash | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | nom_depuis_api=$(curl https://jsonplaceholder.typicode.com/users?_limit=1 | jq -r '.[] | "\(.name)"') | ||
+ | </code> | ||
===== Exemples ===== | ===== 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 ==== | ==== 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,\\ | + | Pour réaliser des tests, si vous ne disposer pas de serveur REST, vous pouvez utiliser le serveur [[https://jsonplaceholder.typicode.com|JSONPlaceholder]] qui renvoi des données "placeholder".\\ |
ci-dessous récupération de 2 utilisateur (remarquer l'option //_limit=2// pour limiter le nombre de retour) : | ci-dessous récupération de 2 utilisateur (remarquer l'option //_limit=2// pour limiter le nombre de retour) : | ||
<code bash> | <code bash> | ||
curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq | curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq | ||
</code> | </code> | ||
- | 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)) : | + | 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)**)) : |
<code bash> | <code bash> | ||
curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq '.[] | "\(.name) \(.address.city)"' | curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq '.[] | "\(.name) \(.address.city)"' | ||
Ligne 62: | Ligne 74: | ||
| jq '.hits.hits[] | ._source.movies.title' | | jq '.hits.hits[] | ._source.movies.title' | ||
</code> | </code> | ||
+ | |||
+ | ==== avec gitlab ==== | ||
+ | Récupération d'informations sur les tickets d'un projet Gitlab : | ||
+ | <code bash>curl --header "PRIVATE-TOKEN:012-abc-345-def" "https://gitlab.com/api/v4/projects/380/issues?page=1" | jq '.[] | "\(.iid):\(.state):\(.title):\(.labels)"'</code> | ||
+ | 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]] | Source : [[https://dev-tips.com/tools/using-jq-to-filter-json-output]] | ||
Ligne 67: | Ligne 86: | ||
===== Voir aussi ===== | ===== Voir aussi ===== | ||
* (en) [[https://github.com/dominictarr/JSON.sh|parser JSON.sh]] pour "aplatir" une sortie JSON | * (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]]// | + | //Contributeur : [[:utilisateurs/bcag2]], [[:utilisateurs/Amiralgaby]]// |