Transformez JSON et rendez-le lisible avec jq
JavaScript Object Notation (JSON) est l'un des formats de données les plus populaires au monde. Il a un support étendu et une spécification simple. Il est facile de travailler avec dans de nombreux langages de programmation, en particulier ceux ciblant le développement Web.
Mais l'inspection manuelle des données JSON reste délicate. Bien qu'il s'agisse d'un format de texte lisible par l'homme, un ensemble de données JSON peut contenir d'énormes quantités de données. Les sources ne formateront pas toujours JSON sous une forme facile à lire.
java L' outil jq permet aux utilisateurs de formater, filtrer et transformer des données JSON.
Qu'est-ce que jq?
Puisqu'il s'agit d'un outil de ligne de commande, vous utiliserez généralement jq en tapant des commandes dans un terminal. Il existe également un excellent terrain de jeu en ligne, que nous abordons plus en détail ci-dessous.
Le fonctionnement normal tourne autour des filtres et de l'application d'un filtre à certains JSON d'entrée. Vous pouvez utiliser jq pour récupérer un seul élément à partir d'un ensemble de plusieurs. Vous pouvez également supprimer certains champs de chaque élément d'un ensemble, simplifiant ainsi les données. Vous pouvez même effectuer des opérations complexes pour traduire l'entrée sous une forme différente.
Comment télécharger et installer jq
Le programme jq n'a pas de dépendances externes, ce qui signifie qu'il est très facile de démarrer. Commencez par télécharger un binaire exécutable pour Linux, macOS ou Windows via le bouton sur la page d'accueil de jq . Une fois le programme téléchargé, vous pouvez l'exécuter directement à partir de la ligne de commande. Vous voudrez peut-être le renommer ( mv jq-osx-amd64 jq ) pour plus de commodité, et vous devrez peut-être le rendre exécutable ( chmod + x jq ).
Confirmez que vous pouvez exécuter jq en l'exécutant à partir de la ligne de commande sans argument:
$ ./jqVous devriez voir des informations générales d'utilisation, en commençant par un simple résumé en une ligne, comme ce qui suit:
jq - commandline JSON processor [version 1.6]Si vous avez du mal avec l'approche ci-dessus, il existe des alternatives. Le logiciel jq prend en charge les gestionnaires de packages courants, et vous pouvez toujours expérimenter le bac à sable en ligne entre-temps.
Utilisation de base de jq
L'utilisation standard est:
jq [options] <jq filter> [file...]Ainsi, par exemple:
$ jq '.' data.jsonVous pouvez également diriger l'entrée via une autre commande comme ceci:
$ echo '{"name":"john"}' | jq '.'
{
"name": "john"
}Ceci est plus utile lorsque, par exemple, la première commande est quelque chose comme un appel à curl qui peut récupérer des données JSON à partir d'un service Web.
Le filtre montré dans ces exemples est la plus simple possible,. (un point) , qui imprime l'entrée sous une forme joliment. C'est déjà très utile, mais les filtres de jq fournissent beaucoup plus de puissance que cela.
Comment appliquer des filtres de base à JSON à l'aide de jq
Un filtre jq est un peu comme un sélecteur CSS ou une expression XPATH. C'est une longue expression composée de parties plus petites. Un filtre complet peut sembler compliqué, mais une fois que vous avez appris les bases, chaque partie doit être compréhensible.
Travailler avec des objets
Vous pouvez récupérer la valeur d'une propriété d'objet à l'aide de la syntaxe .property :
$ echo '{"name":"john"}' | jq '.name'
"john"Cela peut enchaîner pour accéder aux structures imbriquées profondément:
$ echo '{"name":{"first":"john","last":"smith"}}' | jq '.name.last'
"smith"Travailler avec des tableaux
L'opération de tableau la plus simple renvoie un élément via son index:
$ echo '[1,2,3]' | jq '.[2]'
3Notez que, comme avec la plupart des langages de programmation, jq indexe les tableaux à partir de la position 0. Vous pouvez également découper un sous-tableau en utilisant cette syntaxe:
$ echo '[1,2,3]' | jq '.[1:3]'
[
2,
3
]Sans index entre crochets, jq transforme une seule valeur de tableau en son propre contenu, sous forme de valeurs multiples:
$ echo '[1,2,3]' | jq '.[]'
1
2
3C'est une méthode importante pour chaîner les filtres ensemble, que nous montrerons plus tard.
Des fonctionnalités plus avancées
Vous ne pouvez acquérir une compréhension complète de la puissance de jq qu'en lisant le manuel de jq . En fait, la prise en charge par jq des opérateurs, des variables et même des fonctions définies par l'utilisateur le rend capable d'agir comme n'importe quel langage de programmation.
Ces fonctionnalités permettent une utilisation avancée, quoique compliquée. Mais jq possède des fonctionnalités intégrées, telles que des fonctions et des opérateurs, qui profitent même aux tâches simples. Voici un exemple:
$ echo '[2,4,8]' | jq 'add / length'
4.666666666666667Ce filtre alimente l'entrée dans les fonctions d' ajout et de longueur , divisant les résultats. En fonctionnement, il calcule la moyenne d'un tableau de nombres.
L'opérateur de division peut également agir sur des chaînes pour les fractionner en fonction d'un séparateur:
$ echo '"Just testing"' | jq '. / " "'
[
"Just",
"testing"
]La fonction de sélection filtre un tableau, ne conservant que les éléments qui passent une contrainte donnée:
$ echo '[2,4,8]' | jq '.[] | select(. >= 3)'
4
8Notez que c'est aussi un exemple de l'opérateur de tube de jq ( | ) qui est comme un tube de shell. Il alimente le résultat de son filtre de gauche comme entrée de son filtre de droite.
La fonction map est très utile lorsque vous travaillez avec des tableaux. Il effectue une opération sur chaque élément du tableau plutôt que sur l'ensemble du tableau lui-même:
$ echo '[1,2,3]' | jq 'map(.+1)'
[
2,
3,
4
]Vous l'utiliserez souvent en conjonction avec select, par exemple
$ echo '[2,4,8]' | jq 'map(select(. >= 3))'
[
4,
8
]Mettre tout ensemble: un exemple pratique de jq
Puisque jq traite tout JSON valide qui lui est acheminé, vous pouvez lui envoyer la sortie de la commande curl . Cela vous permet de récupérer JSON à partir d'une URL et de le traiter immédiatement sur la ligne de commande:
JSON Feed est une alternative JSON aux formats RSS et Atom. Le site NPR est un exemple qui prend en charge JSON Feed, mais il est difficile à afficher à partir de la source et contient beaucoup de données:

Tout de suite, vous pouvez voir à quel point il est plus facile de lire en récupérant ces données et en les acheminant via jq:
$ curl -s https://feeds.npr.org/1019/feed.json | jq '.'
Voici un exemple plus complet de filtre qui récupère l'identifiant, le titre et la date de chaque article publié par le site un mardi.
$ curl -s https://feeds.npr.org/1019/feed.json |
jq '.items | .[] |
select(
.date_published |
.[0:19] + "Z" |
fromdate |
strftime("%a") == "Tue"
) |
{id: .id, title:.title, date:.date_published}'Après avoir sélectionné la propriété des éléments , ce filtre utilise . [] Pour parcourir chaque élément. La majeure partie du filtre utilise la fonction de sélection pour ne conserver que les publications avec une valeur date_published dont le jour de la semaine ( strftime ("% a") ) est Tue. La fonction strftime nécessite une date formatée très spécifiquement que le filtre . [0:19] + "Z" construit.
Après avoir sélectionné les éléments souhaités, le filtre final crée un objet pour chacun d'eux avec les champs requis. Notez qu'à chaque fois que le flux change, les résultats seront différents. Voici un exemple pris au moment de la publication:
{
"id": "959667930",
"title": "Deplatforming: Not A First Amendment Issue, But Still A Tough Call For Big Tech",
"date": "2021-01-26T17:00:00-05:00"
}
{
"id": "960679189",
"title": "My Pillow CEO Mike Lindell Permanently Suspended From Twitter",
"date": "2021-01-26T10:17:15-05:00"
}
{
"id": "960220477",
"title": "Is Your 401(k) Colluding To Make Cereal More Expensive?",
"date": "2021-01-26T06:31:24-05:00"
}
Comment traiter JSON en ligne à l'aide de jqplay
Si vous voulez essayer jq avant de le télécharger, jqplay est l'endroit idéal pour commencer. Via une interface simple, le site vous permet de saisir un échantillon JSON et un filtre, puis de visualiser le résultat.
Il vous permet également d'essayer plusieurs options différentes. Ceux-ci incluent –compact-output (pour supprimer les espaces) et –null-input (pour afficher le résultat sur une entrée manquante).
L'interface comprend également une section de feuille de triche très utile. Voici une capture d'écran du long exemple précédent :

Notez que, comme pour ce lien, vous pouvez également partager des exemples via une URL.
Utilisez jq pour lire et manipuler des données JSON
Vous pouvez trouver des informations complètes sur jq dans le didacticiel et le manuel, tous deux disponibles sur le site Web de jq. Le programme lui-même offre une aide limitée via l'option –help .
Si vous souhaitez effectuer des filtres et des transformations de base ou lire une grande partie de JSON, jq est un outil précieux.
