Différences

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

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
json_query [Le 27/01/2023, 12:17]
bcag2 [JSON Query (jq)]
json_query [Le 28/03/2024, 13:30] (Version actuelle)
bcag2 [Voir aussi]
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 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 pas) :
 <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 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) :​ 
 +<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 43: 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 48: 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]]//
  • json_query.1674818260.txt.gz
  • Dernière modification: Le 27/01/2023, 12:17
  • par bcag2