3 points par GN⁺ 2023-11-30 | 1 commentaires | Partager sur WhatsApp

Présentation de jaq

  • jaq est un clone de jq, l’outil de traitement de données JSON, qui vise à prendre en charge une grande partie de la syntaxe et des opérations de jq.
  • Les trois objectifs principaux de jaq sont la précision, les performances et la simplicité.
  • Il cherche à maintenir la compatibilité avec jq tout en proposant une implémentation plus précise et plus prévisible.
  • Parmi les exemples de comportements inattendus de jq, on peut citer le fait que nan > nan soit faux et que nan < nan soit vrai, ou encore qu’un plantage se produise lors de l’exécution de jq avec [[[]] | implode.
  • Il a été développé pour répondre au long temps de démarrage de jq et affiche un démarrage environ 30 fois plus rapide que jq 1.6.
  • jaq vise une implémentation simple et compacte afin de réduire les risques de bugs et de faciliter les contributions.

Installation

Installation depuis les sources

  • Un outillage Rust est nécessaire pour compiler jaq.
  • Le compilateur Rust fourni dans les distributions Linux peut être trop ancien pour convenir à la compilation de jaq.
  • Vous pouvez installer jaq avec les commandes cargo install --locked jaq ou cargo install --locked --git https://github.com/01mf02/jaq.
  • jaq devrait fonctionner sur tous les systèmes pris en charge par Rust ; si ce n’est pas le cas, il faut ouvrir une issue.

Installation du binaire

  • Il est possible d’installer jaq avec homebrew sur macOS ou Linux.

Exemples

  • Les exemples suivants montrent ce que jaq peut faire actuellement.
  • En exécutant echo '{"a": 1, "b": 2}' | jaq '.a', la sortie est 1.
  • En exécutant echo '{"a": 1, "b": 2}' | jaq 'add', la sortie est 3.
  • En exécutant echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]', la sortie est [0, 2, 4].

Performances

  • Plusieurs benchmarks comparent les performances de jaq, jq et gojq.
  • Le benchmark empty est utilisé pour mesurer le temps de démarrage.
  • Le benchmark bf-fib exécute, en jq, un interpréteur Brainfuck qui lance un script Brainfuck générant des nombres de Fibonacci.
  • Les autres benchmarks évaluent différents filtres avec des valeurs d’entrée n.
  • Les résultats montrent que jaq-1.2 est le plus rapide sur 16 benchmarks, jq-1.7 sur 2, et gojq-0.12.13 sur 1.

Fonctionnalités

Fonctionnalités de base

  • Prise en charge de nombreuses fonctionnalités de base, comme les types de données fondamentaux, les conditions, l’accès, les opérateurs, la gestion des erreurs, l’interpolation de chaînes et les chaînes de formatage.

Chemins

  • Prise en charge de l’indexation de tableaux/objets, de l’itération, de l’indexation/itération optionnelle, des tranches de tableaux et des tranches de chaînes.

Opérateurs

  • Prise en charge d’opérateurs tels que la composition, la liaison, la concaténation, l’affectation, la mise à jour par affectation, l’alternative, la logique, l’égalité et la comparaison, l’arithmétique, la négation et la suppression d’erreurs.

Définitions

  • Prise en charge des définitions de base et récursives.

Filtres essentiels

  • Prise en charge de divers filtres essentiels.

Filtres standard

  • Les filtres standard sont définis à partir de filtres plus fondamentaux.

Filtres numériques

  • Prise en charge de nombreux filtres issus de libm.

Fonctionnalités avancées

  • Certaines fonctionnalités de jq ne sont pas prises en charge, comme les modules, les opérateurs de style SQL ou le streaming.

Différences entre jq et jaq

Nombres

  • Alors que jq utilise des nombres à virgule flottante 64 bits pour toutes les valeurs numériques, jaq distingue les entiers des nombres à virgule flottante.

NaN et infini

  • jaq propose un comportement plus proche de la norme IEEE 754 pour l’arithmétique en virgule flottante.

Préservation des nombres fractionnaires

  • jaq préserve parfaitement les nombres fractionnaires provenant des données JSON.

Affectation

  • jaq interprète l’affectation différemment de jq.

Définitions

  • jaq autorise les définitions de filtres et, comme jq, permet de passer des arguments par valeur.

Arguments

  • jaq permet de définir des arguments via la ligne de commande.

Réduction

  • jaq fournit les filtres reduce et foreach, avec une interprétation différente de celle de jq.

Gestion des erreurs

  • jaq utilise un mécanisme de gestion des erreurs différent de celui de jq.

Divers

  • jq et jaq présentent aussi des comportements différents pour le slurping, le produit cartésien, la mise à jour de listes, la lecture d’entrée, les jointures, etc.

Contribution

  • Les contributions à jaq sont les bienvenues, et il faut vérifier que cargo test s’exécute avec succès après toute modification.

Remerciements

  • jaq a grandement bénéficié de plusieurs bibliothèques ainsi que de la bibliothèque standard de Rust.

Avis de GN⁺

Le point le plus important ici est que jaq cherche à prendre en charge l’essentiel des fonctionnalités de jq tout en améliorant les performances et la précision. Son temps de démarrage nettement plus rapide que celui de jq, ainsi que sa volonté de réduire les comportements inattendus, peuvent particulièrement intéresser de nombreux utilisateurs. Développé en Rust, il présente aussi des avantages en matière de sécurité mémoire et de performances. Ces améliorations en font un outil potentiellement utile pour les ingénieurs logiciels ayant besoin de traiter des données JSON.

1 commentaires

 
GN⁺ 2023-11-30
Commentaires sur Hacker News
  • Le bug de [[[]] | implode et l’arrêt du développement de jq

    • Le développement de jq a été interrompu pendant 5 ans avant de reprendre récemment, laissant des bugs connus de longue date sans correction. Avec cette reprise, on espère que les problèmes accumulés seront progressivement résolus.
  • Remerciements pour les recommandations d’autres projets

    • C’est appréciable quand un projet recommande d’autres projets similaires ou qui l’ont inspiré. En particulier, la découverte du projet jql est jugée satisfaisante.
  • Question sur le résultat des comparaisons nan > nan et nan < nan

    • Interrogation sur le fait que, dans jq, nan > nan soit faux et nan < nan vrai : est-ce une application fidèle de la norme IEEE 754 pour les nombres à virgule flottante, ou un bug ?
  • Problème d’affichage des nombres uint64 dans jq

    • Expression d’un mécontentement concernant l’incapacité de jq à afficher correctement les nombres uint64.
  • Retour d’expérience sur l’usage de DuckDB à la place de jq

    • jq est puissant, mais lorsque les données sont sous forme tabulaire, l’usage de SQL est jugé plus naturel.
  • Remarque sur le grand nombre de dépendances de jaq

    • Il est souligné que le projet jaq a beaucoup de dépendances.
  • Question sur les usages de jq

    • Question sur le fait de savoir si jq est utilisé pour explorer des fichiers JSON pendant le développement ou l’analyse de données, ou bien dans des programmes exécutés en production.
  • Retour d’expérience sur l’usage de yq à la place de jq

    • Partage d’une expérience où yq a commencé à être utilisé à la place de jq, avec un échange d’opinions sur les principales différences entre les deux outils.
  • Méthode de requête des données dans PowerShell

    • Avec PowerShell, il est possible de convertir toutes les données en objets et de les interroger avec la syntaxe PowerShell, sans avoir à apprendre la syntaxe de nombreux outils comme jq ou xmlstarlet.
  • Avis sur la difficulté de la syntaxe et de la documentation de jq

    • Il est estimé que la syntaxe et la documentation de jq sont difficiles à comprendre, et que cet aspect ne s’est pas amélioré dans les nouvelles versions. Cela laisse entendre qu’il pourrait être préférable d’écrire directement sa propre solution.