- L’option
--argfile, qui n’était plus prise en charge, ainsi que les filtresleaf_pathsetrecurse_downont été supprimés - L’image Docker est désormais fournie via
ghcr.io/jqlang/jqau lieu de Docker Hub - Les cibles de build de release incluent explicitement Linux, macOS, Windows ainsi que plusieurs architectures Docker
--raw-output0a été ajouté pour insérer des octets NUL entre les sorties, et l’affichage de chaînes contenant des NUL est traité comme une erreur- Sous Windows, l’option
--binary/-ba été ajoutée pour permettre une sortie avec des fins de ligne en\nau lieu de\r\n JQ_COLORSpermet de définir la couleur des clés d’objet, et la variable d’environnementNO_COLORest respectée pour désactiver la sortie en couleur- Le problème de code de sortie de l’option
--exit-code/-ea été corrigé : si la dernière valeur de sortie est vraie, le code retourné est 0 ; si c’estfalseounull, c’est 1 ; s’il n’y a aucune sortie, c’est 4 - Des littéraux numériques décimaux sont utilisés pour préserver la précision des littéraux numériques ; les opérations de comparaison respectent cette précision, mais les opérations arithmétiques peuvent la tronquer
- De nouvelles fonctions intégrées
pick(stream),debug(msgs),scan($re; $flags)etabsont été ajoutées - Dans les instructions
if, la brancheelsepeut être omise ; dans ce cas, elle se comporte comme. haltethalt_erroront été modifiés pour s’arrêter immédiatement sans continuer vers l’entrée suivante- Des correctifs ont été apportés à un problème où la représentation de grands nombres produisait un JSON incorrect sur certaines plateformes, à une erreur de segmentation lors de l’utilisation de libjq avec des threads, ainsi qu’au crash d’assertion de
--jsonarg - Le CI, les scan builds, les releases et la build du site web utilisent désormais GitHub Actions, et OSS-Fuzz a été ajouté
1 commentaires
Avis Hacker News
J’adore vraiment JQ, il est excellent.
Dans notre produit (un outil Kafka basé sur la JVM et le navigateur), nous avons implémenté en Clojure un sous-ensemble de JQ pour permettre aux utilisateurs de transformer/filtrer leurs données. C’était l’un des travaux les plus amusants que j’aie jamais codés, et comme j’aime écrire des grammaires, un grand merci aussi à Instaparse : https://github.com/Engelberg/instaparse
En l’implémentant, j’ai découvert que JQ était un LISP-2, ce qui m’a surpris, car ça ne se ressent pas vraiment à la lecture de sa syntaxe : https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
Mais sa syntaxe de requête peu intuitive, le fait de devoir chercher à chaque toute petite étape, et le résultat qui ressemble à une incantation difficile à déchiffrer pour qui n’est pas expert jq, me dérangent. J’ai une répulsion instinctive pour les DSL intégrés dans des chaînes, comme htmx ou tailwind.
Je reconnais tout de même que c’est un logiciel bien conçu et que, parfois, il n’y a pas de meilleure option. C’est aussi l’option la moins mauvaise pour manipuler du JSON en bash, bien meilleure que des monstres à base de sed/awk/cut. Cela dit, les commandes jq plantées au milieu des scripts comme des chaînes indéchiffrables font partie, avec les expressions régulières, des choses que je préfère éviter de voir dans du code. J’ai déjà essayé, comme alternative, de passer du Python inline dans un heredoc via un pipe, mais ça finit aussi brouillon qu’un script jq.
Dans les exemples, sélectionnez « Jq parser (partially working) » puis cliquez sur « Parse » pour voir l’arbre de parsing correspondant au code dans « Input source ». Les retours sont toujours bienvenus.
jq rend la plupart des cas simples (en pratique, une notation pointée pour JSON), tout en permettant aussi les cas complexes de longue traîne.
J’aime jq, mais j’utilise aussi JMESPath (surtout avec AWS CLI), yq (y compris tomlq et xq) et dasel. Dommage que hclq soit pratiquement mort.
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
J’utilise
jqdepuis des années et j’arrive toujours, d’une manière ou d’une autre, à composer ce dont j’ai besoin, mais je ne l’ai jamais trouvé intuitif. Dès que ça devient un peu complexe, il est difficile d’arriver à une solution sans lire longtemps la documentation, et j’aimerais qu’il soit plus facile à utiliser.Elle m’a aidé quand j’apprenais la syntaxe au début, et j’y retourne encore quand je tombe sur une syntaxe étrange.
Son principal usage est de convertir en JSON des choses comme CSV, TOML ou XML, puis de les passer à jq via un pipe : https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
Inspiré de XPath, il est plus familier qu’un DSL entièrement nouveau, et je considère que sa fonction clé est la recherche récursive de clés. En écrivant
people..address, on récupère toutes les clés « address » situées sous « people », où qu’elles se trouvent dans le JSON. C’est mon langage de parsing préféré pour JSON, et j’ai aussi écrit un article expliquant comment l’utiliser pour parser des jeux de données JSON.https://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
Si vous n’utilisez jq qu’occasionnellement et devez relire la documentation à chaque fois, gron vaut le détour. C’est du JSON que l’on peut grepper
https://github.com/tomnomnom/gron
J’utilise
curl cheat.sh/jqdepuis des années, et je trouve que cheat.sh est globalement une excellente ressource. Aujourd’hui, j’utiliserais probablement quelque chose comme ChatGPTOn peut même faire des choses du genre
gron | grep | sed | gron -uL’une des raisons pour lesquelles j’aime jq, ou du moins je le supporte, c’est sa stabilité. Des scripts écrits il y a plusieurs années fonctionnent encore exactement de la même façon aujourd’hui
À l’inverse, le code que j’avais gardé pour yq s’est souvent cassé, parce que yq n’a cessé d’évoluer d’une manière non rétrocompatible. Je n’ai pas vérifié à quelle fréquence ces changements ont eu lieu, mais j’en ai subi plusieurs fois les effets dans des contextes comme des scripts CI, où les versions des outils de base varient et ne sont pas mises à jour au même rythme
J’ai donc toujours été reconnaissant aux mainteneurs de jq de comprendre l’importance de la rétrocompatibilité. J’espère que cette annonce ne signifie pas que cette stabilité n’était qu’un effet secondaire accidentel de la stagnation, et que corriger cette stagnation se fera au prix de la stabilité
https://kislyuk.github.io/yq/
https://github.com/kyle-long/yq#yq
https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
https://github.com/simonrupf/convert2json#convert2json
En plus des outils proches de jq, il existe des outils intéressants à utiliser avec jq, comme jo et jc
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
Je découvre gron ici, mais je l’ajoute pour être complet. Par ailleurs, JSON semble devenir une sorte de format de sortie standard pour les outils en ligne de commande. Idéalement, tous les outils CLI proposeraient un flag du genre
--json, ce qui rendrait jc inutilehttps://jless.io/
https://github.com/tomnomnom/gron
Article lié du mois dernier, « First release of jq in 5 years » : https://news.ycombinator.com/item?id=36951830
Je suis un grand fan de jq et je l’utilise en permanence
Enfin
C’est vraiment chouette de voir comment la communauté s’est mobilisée pour recruter de nouveaux mainteneurs et relancer le projet. Remerciements particuliers à @stedolan, @itchyny et @owenthereal, d’après leurs noms d’utilisateur GitHub
jq et miller sont des indispensables dans ma boîte à outils, avec awk et vim
https://github.com/johnkerl/miller
La nouvelle fonction intégrée
pick(stream)ajoute la possibilité d’émettre une projection de l’objet ou du tableau d’entréejq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'C’est vraiment une fonction providentielle. Merci aux contributeurs
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pickqui fonctionne aussi sur des données en streamingJe voudrais aussi recommander jaq. C’est un clone de jq axé sur l’exactitude, la vitesse et la simplicité
Il n’implémente qu’un sous-ensemble de jq, mais je l’utilise jusqu’ici avec pas mal de satisfaction : https://github.com/01mf02/jaq