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).

Ce qu'est JSON Lines (JSONL)

JSON Lines est un format dans lequel chaque ligne contient un objet JSON. Le fichier dans son ensemble n'est pas du JSON, si bien qu'il n'y a pas de virgule finale à gérer et qu'ajouter des enregistrements revient à ajouter des lignes. Il est très répandu partout où les données circulent un enregistrement à la fois : journaux applicatifs, jeux d'entraînement pour l'apprentissage automatique, chargements en masse dans BigQuery ou Elasticsearch. Les extensions usuelles sont `.jsonl` et `.ndjson`.

Cet outil convertit dans les deux sens entre JSON Lines et un tableau JSON. De JSONL vers un tableau, les lignes vides sont ignorées et toute ligne qui n'est pas du JSON valide est signalée. Dans l'autre sens, l'entrée doit comporter un tableau au niveau supérieur, faute de quoi la conversion échoue. Tout s'exécute dans votre navigateur : les journaux et les données d'entraînement que vous préférez ne pas transmettre restent sur votre machine.

Comment convertir entre JSONL et un tableau JSON

  1. Choisissez le sens De JSONL vers un tableau JSON, ou d'un tableau JSON vers JSONL.
  2. Collez les données Pour du JSONL, un objet par ligne. Pour un tableau, collez tel quel le texte commençant par `[`.
  3. En cas d'erreur, examinez la ligne indiquée Le message précise quelle ligne n'a pas pu être analysée. Une virgule finale ou un guillemet non fermé en sont les causes habituelles.
  4. Copiez le résultat Enregistrez la sortie dans un fichier ou transmettez-la directement à l'étape suivante de votre chaîne.

Astuces pour en tirer le meilleur parti

  • 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.

Dans quelles situations cette conversion sert

Transmettre des journaux à un outil d'analyse

Des journaux applicatifs écrits un enregistrement par ligne deviennent exploitables par des outils et des bibliothèques conçus pour les tableaux, une fois rassemblés en tableau JSON.

Préparer des données d'apprentissage

Les jeux d'entraînement sont souvent diffusés en JSONL alors que les scripts de prétraitement attendent un tableau. L'outil fait le lien.

Charger dans BigQuery ou Elasticsearch

Tous deux acceptent du JSON délimité par des sauts de ligne en entrée : un tableau dont vous disposez peut donc être converti en une forme qu'ils ingèrent.

Rendre un gros fichier JSON traitable ligne par ligne

Un tableau doit être lu en entier avant que le traitement puisse commencer ; en JSONL, il se traite une ligne à la fois.

Le vocabulaire de JSON Lines

JSON Lines (JSONL)
Un format comportant une valeur JSON par ligne. **Le fichier dans son ensemble n'est pas du JSON valide**, puisque plusieurs valeurs se succèdent. Son intérêt est que chaque ligne se lit indépendamment.
NDJSON
Abréviation de Newline Delimited JSON, pour l'essentiel la même chose que JSON Lines. L'extension `.ndjson` vient de cette appellation.
Traitement en flux
Traiter les données dès leur arrivée, sans les charger entièrement au préalable. JSONL se prête à cette approche, d'où leur association fréquente.
Niveau supérieur
La valeur la plus externe d'un document JSON. La conversion vers JSONL exige ici un tableau `[...]` ; un objet `{...}` ne peut pas être converti.
Lignes vides
En JSONL, les lignes vides n'ont aucune signification. Cet outil les ignore, si bien qu'un saut de ligne isolé en fin de fichier ne casse pas la conversion.

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.
Tool-kun

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.