Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
json_query [Le 27/01/2023, 12:13] – créée bcag2json_query [Le 05/01/2025, 23:10] (Version actuelle) – correction et syntaxe d'option Amiralgaby
Ligne 1: Ligne 1:
-{{tag>console BROUILLON}}+{{tag>console}}
  
 ---- ----
Ligne 5: Ligne 5:
 ====== JSON Query (jq) ====== ====== 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+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 ===== ===== 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>
  
-Exemple 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)+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 ===== 
 +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 renvoi des données "placeholder".\\ 
 +ci-dessous récupération de 2 utilisateur (remarquer l'option //_limit=2// pour limiter le nombre de retour) : 
 +<code bash> 
 +curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq 
 +</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|how to get multiple values from a json array/object using jq (StackOverflow)]] **(en)**)) : 
 +<code bash> 
 +curl https://jsonplaceholder.typicode.com/users?_limit=2 | jq '.[] | "\(.name) \(.address.city)"' 
 +</code> 
 + 
 +==== 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)
 <code bash> <code bash>
 curl "https://api-adresse.data.gouv.fr/search/?q=professeur&postcode=69007&limit=3" | jq '.features[0].properties.name' curl "https://api-adresse.data.gouv.fr/search/?q=professeur&postcode=69007&limit=3" | jq '.features[0].properties.name'
Ligne 42: Ligne 68:
 </code> </code>
  
 +==== avec un serveur elasticsearch exécuter sur votre poste/serveur ====
 Autre exemple avec [[:elasticsearch]] en reprenant l'exemple autour des //movies// : Autre exemple avec [[:elasticsearch]] en reprenant l'exemple autour des //movies// :
 <code bash> <code bash>
Ligne 47: 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]]
 +
 +===== 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]]//+//Contributeur : [[:utilisateurs/bcag2]], [[:utilisateurs/Amiralgaby]]//