Ceci est une ancienne révision du document !



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

Installer avec les droits d'administration le paquet jq

apt install jq

On peut l'utiliser simplement :

curl service:<port>/<table_ou_vue> | jq

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) :

curl service:<port>/<table_ou_vue> | jq '.[] | .mon_attribut'

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 :

curl service:<port>/<table_ou_vue> | jq '.[3:5]'

ou des deux derniers :

curl service:<port>/<table_ou_vue> | jq '.[-2:]'

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'

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


Contributeur : bcag2


1)
src pour l'interpolation de chaîne de caractères : https://stackoverflow.com/a/71964370/6614155
  • json_query.1690367086.txt.gz
  • Dernière modification: Le 26/07/2023, 12:24
  • par bcag2