← Tous les articles

Comment convertir JSON en CSV (et inversement)

Convertir JSON en CSV et CSV en JSON — en JavaScript, Python et en ligne. Couvre le mapping tableau-d'objets, les règles de guillemets, les valeurs imbriquées et la coercition de types.

JSON est le langage des APIs ; CSV est le langage des tableurs, des bases de données et des analystes. Convertir entre les deux est une tâche quotidienne —— exporter une réponse d’API vers Excel, ou transformer un tableur en JSON pour un import. Ce guide montre comment convertir JSON en CSV et CSV en JSON, en JavaScript, en Python et instantanément dans votre navigateur —— ainsi que les cas limites (données imbriquées, guillemets, types) qui font trébucher.

Le cœur du mapping : tableau d’objets ⇄ lignes

Un fichier CSV est un tableau : une ligne d’en-tête avec les noms de colonnes, puis une ligne par enregistrement. La forme JSON qui s’aligne naturellement sur ce tableau est un tableau d’objets, où chaque objet est une ligne et chaque clé une colonne.

// JSON
[
  { "id": 1, "name": "Ada Lovelace", "active": true },
  { "id": 2, "name": "Bob Khan", "active": false }
]
# CSV
id,name,active
1,Ada Lovelace,true
2,Bob Khan,false

L’en-tête est l’union des clés de tous les objets (ainsi les objets aux champs différents restent alignés), et chaque ligne va chercher la valeur correspondante pour chaque colonne.

Convertir JSON en CSV en JavaScript

Il n’existe pas de JSON.toCSV natif, mais la conversion tient en peu de lignes. Le seul vrai travail est l’échappement : toute valeur contenant une virgule, un guillemet ou un saut de ligne doit être entourée de guillemets doubles, et les guillemets internes doublés.

function jsonToCsv(rows) {
  if (!rows.length) return '';
  const headers = [...new Set(rows.flatMap(Object.keys))];

  const escape = (v) => {
    if (v == null) return '';
    const s = typeof v === 'object' ? JSON.stringify(v) : String(v);
    return /[",\n\r]/.test(s) ? '"' + s.replace(/"/g, '""') + '"' : s;
  };

  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

Notez la branche typeof v === 'object' : un objet ou un tableau imbriqué n’a pas de représentation CSV plate, donc la convention courante est de le sérialiser en texte JSON à l’intérieur de la cellule. Plus de détails plus bas.

Convertir CSV en JSON en JavaScript

Dans l’autre sens, le piège est de parser correctement le CSV —— les champs peuvent contenir des virgules et des sauts de ligne dans des guillemets, donc on ne peut pas se contenter de split(','). Utilisez une petite machine à états (ou une librairie comme papaparse en prod) :

function csvToJson(text) {
  const rows = [];
  let row = [], field = '', inQuotes = false;
  for (let i = 0; i < text.length; i++) {
    const c = text[i];
    if (inQuotes) {
      if (c === '"' && text[i + 1] === '"') { field += '"'; i++; }
      else if (c === '"') inQuotes = false;
      else field += c;
    } else if (c === '"') inQuotes = true;
    else if (c === ',') { row.push(field); field = ''; }
    else if (c === '\n') { row.push(field); rows.push(row); row = []; field = ''; }
    else if (c !== '\r') field += c;
  }
  if (field || row.length) { row.push(field); rows.push(row); }

  const [headers, ...data] = rows;
  return data.map((cells) =>
    Object.fromEntries(headers.map((h, i) => [h, cells[i] ?? ''])));
}

Convertir JSON et CSV en Python

La bibliothèque standard de Python le fait nativement —— pas besoin de dépendance.

import csv, json, io

# JSON -> CSV
rows = json.loads(json_text)
buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
csv_text = buf.getvalue()

# CSV -> JSON
rows = list(csv.DictReader(io.StringIO(csv_text)))
json_text = json.dumps(rows, indent=2)

Les cas limites qui comptent vraiment

Objets et tableaux imbriqués

Le CSV est plat ; JSON ne l’est pas. Quand une valeur est un objet ou un tableau, deux options : la sérialiser en JSON dans une cellule (simple, réversible) ou l’aplatir en plusieurs colonnes comme address.city, address.zip (lisible, mais avec perte et plus difficile à inverser). Pour faire un aller-retour, le JSON-dans-une-cellule est plus sûr.

Le CSV perd les types

Le CSV n’a pas de types —— chaque champ est du texte. En passant de CSV à JSON, "1" est une chaîne sauf si vous le convertissez délibérément en nombre. Attention aux valeurs comme 007 (un code postal/ID à garder en chaîne) ou aux énormes entiers qui perdent en précision en tant que nombres. Ne convertissez que lorsque l’aller-retour reste sans perte.

Guillemets et délimiteurs

Mettez toujours entre guillemets les champs contenant virgules, guillemets ou sauts de ligne. Certaines locales (courant pour l’Excel européen) utilisent ; comme délimiteur —— si votre CSV semble bizarre sur une colonne, vérifiez d’abord le délimiteur.

Clés incohérentes

Si vos objets JSON n’ont pas tous les mêmes clés, construisez l’en-tête à partir de l’union des clés et laissez les cellules manquantes vides —— ne supposez pas que le premier objet définit toutes les colonnes.

Excel et le BOM UTF-8

Si votre CSV sera ouvert dans Excel et contient des caractères non-ASCII, préfixez-le d’un BOM UTF-8 (les octets 0xEF 0xBB 0xBF). Excel lit l’UTF-8 sans BOM comme l’encodage legacy et casse les accents/caractères asiatiques. La plupart des librairies CSV peuvent émettre le BOM via une option.

// JavaScript —— écrire un BOM pour qu’Excel lise l’UTF-8 correctement
const out = '\uFEFF' + jsonToCsv(rows);

Délimiteurs alternatifs (CSV vs TSV vs ;)

« CSV » n’est pas toujours séparé par des virgules. Variantes courantes :

  • TSV —— séparé par tabulations ; plus sûr quand les valeurs contiennent souvent des virgules.
  • Excel européen émet ; comme délimiteur dans les locales où la virgule est le séparateur décimal.

Si la sortie ressemble à une seule colonne bizarre à l’ouverture, le fichier utilise un délimiteur différent de celui attendu par le lecteur. Standardisez-en un (CSV avec , + BOM pour Excel multi-locale, ou TSV pour les pipelines d’ingénierie).

Pour du CSV réel, utilisez PapaParse

Pour parser dans le navigateur/Node du CSV venant d’utilisateurs, utilisez PapaParse —— il gère la détection du délimiteur, les champs entre guillemets, les valeurs multi-lignes, les en-têtes et dynamicTyping pour la conversion en nombre/booléen. Les snippets manuels au-dessus suffisent pour des entrées simples et de confiance ; à l’échelle, c’est PapaParse qu’il faut sortir.

Convertir JSON en CSV en ligne —— sans configuration

Pour une conversion ponctuelle, sautez le code. Collez votre JSON dans le convertisseur JSON vers CSV de fixjson et cliquez sur To CSV, ou collez du CSV et cliquez sur To JSON. Il gère l’échappement, l’union des clés et la conversion de types automatiquement, et tourne intégralement dans votre navigateur —— rien n’est uploadé, ce qui importe quand les données contiennent des enregistrements clients ou des exports internes.

Questions fréquentes

Comment convertir JSON en CSV ?

Prenez un tableau JSON d’objets, construisez une ligne d’en-tête à partir de l’union de toutes les clés, puis écrivez une ligne par objet —— en échappant toute valeur contenant virgule, guillemet ou saut de ligne. Utilisez csv.DictWriter en Python, une petite fonction en JavaScript, ou collez-le dans le convertisseur en ligne.

Comment convertir CSV en JSON ?

Parsez le CSV (en respectant les champs entre guillemets), considérez la première ligne comme en-tête et associez chaque ligne suivante à un objet dont les clés sont ces en-têtes. N’oubliez pas que toutes les valeurs arrivent en chaînes sauf si vous les convertissez.

Comment les objets JSON imbriqués sont-ils représentés en CSV ?

Le CSV n’imbrique pas, donc un objet ou tableau imbriqué est généralement écrit comme texte JSON dans une seule cellule, ou aplati en colonnes pointées comme address.city. Le JSON-dans-cellule est l’option réversible.

Puis-je convertir JSON en CSV en ligne gratuitement ?

Oui —— le convertisseur de fixjson fait les deux sens gratuitement, intégralement dans votre navigateur, sans compte ni upload.

Outils et guides liés