jq est un outil en ligne de commande de manipulation de JSON.
J'ai écrit un tutoriel sur jq qui illustre les fonctions de base avant de montrer des usages plus complexes.
Je découvre l'opérateur de remplacement : « // ». Si un attribut existe et qu'il n'a pas null ou false comme valeur, alors jq
l'utilisera. Sinon, il effectuera une autre action au choix (afficher un texte de substitution, récupérer un autre attribut, etc.).
Pratique pour formater la sortie (afficher un message générique plutôt que « null » ou du vide).
Exemple : dans ces fichiers JSON, l'attribut « suppliers » vaut parfois « null ». On voudrait afficher le fournisseur et « n/a » (not available) quand l'attribut vaut null.
Manière de faire : jq '.suppliers // "n/a"' *.json
.
Afficher le nom du câble et son fournisseur (« n/a » si inconnu) ? jq -r '"\(.name): \(.suppliers // "n/a")"' *.json
L'opérateur de remplacement est également pratique pour travailler avec les fonctions de jq
qui plantent quand elles rencontrent autre chose qu'un type précis.
Exemple : gsub
veut forcément travailler sur une chaîne de caractères, donc quand elle rencontre un null, elle affiche « null (null) cannot be matched, as it is not a string.
Il est vrai qu'on peut alors rediriger stderr vers Dave Null et basta. Mais ce contournement ne fonctionne pas au sein d'une interpolation de chaîne ("\(.suppliers)"
) dans une affectation : jq
ne fera rien, même si l'instruction se trouve au sein d'une boucle (et que, donc, les valeurs non-null de l'attribut devraient être affectées).