Convertisseur JSON Lines (JSONL) ⇔ tableau JSON

Convertit entre le format JSON Lines (un objet JSON par ligne) et un tableau JSON standard. Pratique pour vérifier des jeux de données de machine learning et des sorties de journaux (logs).

Astuces d'utilisation

  • JSON Lines (JSONL) est un format qui aligne un objet JSON indépendant par ligne ; il est notamment utilisé par défaut dans les jeux de données de fine-tuning d'OpenAI et dans les sorties de journaux d'outils comme Elasticsearch/Logstash.
  • En mode « JSONL → Tableau JSON », chaque ligne doit être un objet JSON analysable individuellement. Les lignes vides sont ignorées automatiquement.
  • En mode « Tableau JSON → JSONL », l'ensemble de l'entrée doit être un unique tableau JSON (`[ ... ]`). Chaque élément du tableau est généré sous la forme d'une ligne JSONL.
  • Convertir un gros fichier de journal de JSONL vers un tableau JSON permet de le manipuler plus facilement avec la commande `jq` ou l'analyseur de tableau JSON standard de votre langage de programmation.

Questions fréquentes

Un tableau JSON enveloppe l'ensemble dans un unique tableau, comme `[ {...}, {...} ]`, si bien qu'on ne peut pas accéder à un élément individuel sans analyser la totalité. JSON Lines, en revanche, aligne un objet JSON indépendant par ligne, ce qui permet un traitement en flux ligne par ligne — idéal pour le traitement séquentiel d'énormes fichiers de journaux ou de jeux de données de machine learning.

C'est le format standard des jeux de données de fine-tuning chez OpenAI et sur d'autres plateformes de machine learning, le format de sortie d'outils de collecte de journaux comme Elasticsearch et Logstash, ainsi que pour le traitement en flux de gros volumes de données — partout où il faut lire et écrire des enregistrements indépendamment, un par un.

En mode « JSONL → Tableau JSON », chaque ligne doit être un JSON valide à elle seule ; si ne serait-ce qu'une ligne comporte une erreur de syntaxe, un message d'erreur indiquant ce numéro de ligne s'affiche. En mode « Tableau JSON → JSONL », l'ensemble de l'entrée doit être un tableau (commençant par `[` et se terminant par `]`).

Le résultat converti en tableau JSON peut être utilisé directement avec la commande `jq` ou l'analyseur JSON standard de votre langage de programmation. À l'inverse, le résultat converti en JSONL s'associe bien à `jq -c`, `grep`, `awk` et d'autres outils orientés ligne, ce qui facilite son intégration dans un pipeline d'analyse de journaux.
ツールくん

Anecdote — Pourquoi le format « un enregistrement par ligne » est-il né ?

Le format JSON Lines (aussi appelé JSONL) est né du constat qu'un tableau JSON classique impose une contrainte fondamentale : impossible d'extraire ne serait-ce qu'un seul enregistrement tant que l'ensemble du tableau n'a pas été chargé en mémoire et entièrement analysé. Traiter des données de journaux ou des jeux d'entraînement de machine learning comptant plusieurs millions de lignes comme un unique tableau JSON obligeait à charger le fichier entier en mémoire, ce qui posait des problèmes de manque de mémoire et de temps d'analyse démesurés pour les fichiers volumineux.

JSON Lines résout ce problème avec une règle simple : une ligne équivaut à un objet JSON complet. Le fichier pouvant être lu et analysé ligne par ligne au fur et à mesure, il n'est pas nécessaire de le charger entièrement en mémoire, ce qui le rend particulièrement adapté au traitement en flux et en parallèle. Cette philosophie de conception s'accorde également bien avec la culture Unix traditionnelle du texte « un enregistrement par ligne » (des commandes comme `grep`, `awk` et `sed` fonctionnent ligne par ligne), ce qui constitue un avantage pratique important puisqu'elle s'intègre directement aux chaînes d'outils en ligne de commande existantes.

Aujourd'hui, il est largement adopté comme format de distribution de jeux de données dans les domaines de l'IA et du machine learning, et il est désormais courant que les données d'entraînement des grands modèles de langage ainsi que les paires prompt/réponse destinées au fine-tuning soient distribuées au format JSON Lines.