Les six façons en un coup d’œil
Avant les détails, voici tout le panorama en un seul passage, parce que la façon la plus rapide de choisir est d’éliminer cinq options. Façon 1, la page de convertisseur côté client, ne demande rien à installer et garde le fichier sur votre machine, mais vous répétez les clics pour chaque fichier. Façon 2, Python avec la bibliothèque standard seulement, demande Python 3 et rien d’autre, traite parfaitement les données plates, et laisse les valeurs imbriquées sous forme de texte repr Python. Façon 3, Python avec pandas, aplatit les objets imbriqués en colonnes en notation pointée automatiquement, mais demande pandas installé et encore une correction d’une ligne pour les listes. Façon 4, jq, est une seule ligne de terminal pour les données plates et échoue bruyamment, au lieu d’échouer à tort, sur les données imbriquées. Façon 5, un script Node, aplatit les objets imbriqués et joint les listes avec une fonction que vous pouvez lire en entier, et s’intègre naturellement dans un projet. Façon 6, VS Code ou Excel, ne demande aucune nouvelle installation si vous utilisez déjà l’outil, et échange du contrôle contre de la commodité.
Deux questions éliminent la plus grande partie de la liste avant même de lire la suite. D’abord, vos données sont-elles plates ou imbriquées ? Des données plates, un seul niveau de clés par objet, fonctionnent avec les six façons. Des données imbriquées, des objets dans des objets ou des listes dans des objets, excluent la commande jq simple et le script Python simple avec la bibliothèque standard, sauf si vous ajoutez un aplatissement. Ensuite, ferez-vous cela à nouveau ? Une conversion unique favorise la page ou l’outil que vous avez déjà. Un export hebdomadaire favorise un script, parce que la même commande donne les mêmes colonnes dans le même ordre à chaque fois. Gardez ces deux questions en tête et le reste du guide devient une table de consultation.
Chaque affirmation de ce guide a été testée sur le même échantillon avant publication : trois commandes, chacune avec un identifiant, un objet client imbriqué avec un nom et une ville, une liste d’étiquettes, et un total. Des variantes plates du même fichier ont été utilisées quand une méthode ne traite que les données plates. Quand une méthode échoue sur des données imbriquées, ce guide le dit et montre l’échec exact au lieu de l’adoucir, parce qu’un échec que vous pouvez voir est plus sûr qu’une table fausse que vous ne pouvez pas voir.
Façon 1 : la page de convertisseur côté client
La façon locale la plus simple est le convertisseur de cette page, et elle compte comme locale même si elle vit sur un site web. Quand vous collez du JSON ou envoyez un fichier, la page analyse le JSON, l’aplatit, et construit le texte CSV dans votre onglet de navigateur, puis vous remet le résultat sous forme de fichier téléchargé. Il n’y a aucune étape d’envoi vers un serveur et aucun serveur qui attend vos données, parce que le code de conversion est livré avec la page et tourne sur votre machine. Le seul bouton de la page qui touche le réseau est le bouton facultatif de récupération depuis une URL, qui charge du JSON depuis une adresse web que vous tapez. Collez ou envoyez le fichier au lieu de le récupérer, et le réseau n’est jamais utilisé.
Vous pouvez vérifier cette affirmation vous-même en une trentaine de secondes. Ouvrez le convertisseur, déconnectez-vous du réseau ou activez le mode avion, puis collez du JSON et convertissez-le. Cela fonctionne toujours, parce que rien dans la conversion n’a besoin du réseau. Ce test vaut la peine d’être fait une fois, parce qu’une affirmation sur la confidentialité vaut la peine d’être vérifiée plutôt que crue, et celle-ci passe le test.
La page est la bonne façon pour un fichier unique, pour une machine sur laquelle vous ne pouvez rien installer, et pour un fichier que vous voulez convertir avant de vous engager dans un script. Ses limites sont celles de toute page : vous répétez les clics pour chaque fichier, et un très gros fichier ralentira l’onglet. Elle décide aussi de certaines choses pour vous, comme l’ordre des colonnes et le comportement d’aplatissement, à travers ses options plutôt qu’à travers du code que vous contrôlez. Pour un seul fichier, ces limites n’ont pas d’importance. Pour un export hebdomadaire, choisissez un script ci-dessous et gardez la page comme vérification rapide.
Façon 2 : Python avec la bibliothèque standard seulement
Python est la façon locale la plus utile pour la plupart des gens, parce qu’il est déjà installé sur la plupart des machines de développeurs et que la bibliothèque standard seule suffit. Pas de pandas, pas de paquets, rien à télécharger. Le script ci-dessous lit un fichier JSON composé d’objets, prend les noms de colonnes du premier objet, et écrit un CSV avec le module csv standard, qui gère les guillemets correctement tout seul. Enregistrez-le sous json2csv.py et lancez-le avec python3 json2csv.py orders.json orders.csv.
import json, csv, sys
with open(sys.argv[1]) as f:
rows = json.load(f)
with open(sys.argv[2], 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)Testé sur l’échantillon des trois commandes, ce script a produit une ligne d’en-tête plus trois lignes de données, et le résultat montre sa seule limite honnête en pleine lumière. L’objet client imbriqué est sorti sous forme de chaîne repr Python, comme {’name’: ’Ana’, ’city’: ’Lima’}, et la liste d’étiquettes est sortie sous forme de liste repr, comme [’new’, ’vip’]. Un simple DictWriter n’aplatit pas les valeurs imbriquées, donc les données plates se convertissent parfaitement et les données imbriquées se convertissent de façon visiblement fausse, ce qui est au moins facile à repérer. La correction est une courte fonction récursive qui transforme les objets imbriqués en clés en notation pointée, customer.name et customer.city, avant l’écriture, et c’est exactement ce que fait le script Node de la façon 5.
Le module csv fait un vrai travail pour vous ici. Il met entre guillemets les cellules qui contiennent le délimiteur, double les guillemets internes, et écrit les fins de ligne que votre tableur attend. Ne construisez pas un CSV en joignant vous-même les valeurs avec des virgules. Un assemblage manuel casse à la première virgule à l’intérieur d’une valeur, et cette casse est silencieuse : le fichier semble correct jusqu’à ce qu’une colonne se décale. La version avec la bibliothèque standard tourne aussi de la même façon sur chaque machine équipée de Python 3, et c’est pourquoi c’est la méthode à choisir quand un collègue doit lancer votre conversion aussi.
Façon 3 : Python avec pandas json_normalize
Si la façon 2 est le minimum honnête, la façon 3 est l’amélioration que la plupart des gens veulent vraiment. La fonction pandas json_normalize prend les objets imbriqués et les transforme en colonnes en notation pointée automatiquement, donc customer devient customer.name et customer.city sans aucune fonction que vous écriviez vous-même. Le script ci-dessous lit le même fichier de commandes, le normalise, et écrit un CSV. Il demande pandas installé, ce qui représente une seule installation, et ensuite tout le travail tient en trois lignes.
import json, pandas as pd
with open('orders.json') as f:
rows = json.load(f)
df = pd.json_normalize(rows)
df.to_csv('orders.csv', index=False)Testé sur le même échantillon de trois commandes, json_normalize a produit les colonnes id, tags, total, customer.name, et customer.city, avec trois lignes. C’est le comportement à attendre : les objets imbriqués s’aplatissent, les champs plats passent tels quels, et les colonnes imbriquées aplaties viennent après les colonnes plates. Les listes sont le piège qui reste. La liste d’étiquettes est sortie sous forme de texte repr Python, comme dans la façon 2, parce que json_normalize ne devine pas ce qu’une liste veut dire. La correction d’une ligne consiste à joindre les listes courtes avant l’écriture, par exemple df[’tags’] = df[’tags’].apply(lambda v: ’; ’.join(v) if isinstance(v, list) else v), ce qui transforme la liste en une cellule lisible. Pour une liste où chaque élément doit devenir sa propre ligne, c’est une opération différente, l’éclatement, et pandas a une étape explode séparée pour cela. La règle est simple : l’aplatissement traite les objets, la jointure traite les listes courtes, l’éclatement traite les listes qui signifient des lignes.
Pandas est la bonne façon quand vos données sont imbriquées, quand vous les nettoierez ou les filtrerez avant l’écriture, et quand vous travaillez déjà en Python. C’est la mauvaise façon quand l’installation d’un paquet n’est pas possible, ou quand le travail est un seul fichier plat que jq ou la page terminerait plus vite. L’installation est le seul vrai coût, et elle est rentabilisée dès la deuxième conversion.
Façon 4 : jq, la commande en une ligne pour les données plates
Si vous utilisez déjà le terminal, jq transforme tout le travail en une seule ligne, pour les données plates. Il lit le JSON, choisit les clés du premier objet comme en-tête, puis émet chaque ligne sous forme de ligne CSV, avec les guillemets gérés par son formateur @csv. Aucun fichier de script, aucune boucle, aucun guillemet manuel. La commande ci-dessous lit un fichier de commandes plat, id, city, et total par commande, et écrit orders.csv. Notez la limite, énoncée plainement : le formateur @csv rejette les objets imbriqués et les listes, donc cette commande en une ligne est réservée aux exports plats, et l’échantillon imbriqué des sections précédentes échoue dessus avec une erreur au lieu d’une table fausse, ce qui est le type d’échec sûr.
jq -r '(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv' orders-flat.json > orders.csvTesté sur un fichier plat de trois commandes, le résultat a été une ligne d’en-tête entre guillemets, "id","city","total", suivie de trois lignes de données avec les cellules de texte entre guillemets et les nombres nus, exactement la forme que produit @csv. Le détail keys_unsorted compte : des clés simples trieraient les colonnes par ordre alphabétique, ce qui changerait l’ordre des colonnes par rapport à votre fichier. Si vos données ont des objets imbriqués, jq a besoin d’abord d’un filtre d’aplatissement, et la commande en une ligne devient un petit script. Pour les exports plats, ce que la plupart des réponses de listes d’API sont déjà une fois déballées, la commande en une ligne est tout le travail, et elle tourne hors ligne sur toute machine équipée de jq.
Une précaution : jq lit tout le fichier en mémoire, donc un export de plusieurs gigaoctets le mettra à rude épreuve tout comme il mettrait à rude épreuve un onglet de navigateur. Pour les exports ordinaires, jusqu’à des dizaines de mégaoctets, c’est instantané. Pour les très gros fichiers, découpez d’abord le fichier ou utilisez un outil de flux, et traitez cela comme un problème séparé de la conversion.
Façon 5 : Node, quand la conversion vit dans un projet
Node est la bonne façon locale quand la conversion fait partie d’un projet plutôt que d’une tâche unique : une étape de build, un pipeline de données, un script que l’équipe lance déjà. Node est livré avec l’analyse JSON intégrée, donc le seul travail est de transformer les lignes en texte CSV, et le petit script ci-dessous le fait avec une fonction d’aplatissement par points pour que les objets imbriqués deviennent des colonnes en notation pointée, comme le comportement de la page de convertisseur. Enregistrez-le sous json2csv.mjs et lancez-le avec node json2csv.mjs orders.json orders.csv.
import { readFileSync, writeFileSync } from 'node:fs';
const flatten = (obj, prefix = '', out = {}) => {
for (const [k, v] of Object.entries(obj)) {
const key = prefix ? prefix + '.' + k : k;
if (v && typeof v === 'object' && !Array.isArray(v)) flatten(v, key, out);
else out[key] = Array.isArray(v) ? v.join('; ') : v;
}
return out;
};
const rows = JSON.parse(readFileSync(process.argv[2], 'utf8')).map(r => flatten(r));
const cols = [...new Set(rows.flatMap(r => Object.keys(r)))];
const esc = v => v == null ? '' : /[",\n]/.test(String(v)) ? '"' + String(v).replaceAll('"', '""') + '"' : String(v);
const lines = [cols.join(','), ...rows.map(r => cols.map(c => esc(r[c])).join(','))];
writeFileSync(process.argv[3], lines.join('\n'));Testé sur le même échantillon, le script a produit l’en-tête id,customer.name,customer.city,tags,total et trois lignes, avec l’objet client imbriqué aplati en deux colonnes et la liste d’étiquettes jointe avec un point-virgule et un espace. La fonction d’échappement suit la même règle que la page de convertisseur : mettre une cellule entre guillemets seulement quand elle contient le délimiteur, un guillemet, ou un saut de ligne, et doubler les guillemets internes. Cette règle est tout l’art des guillemets CSV, et la respecter est la différence entre un fichier qui s’ouvre proprement et un fichier qui décale silencieusement les colonnes.
Le script est délibérément court pour que vous puissiez le lire avant de le lancer. Il prend l’union de toutes les colonnes de toutes les lignes, donc une ligne à qui il manque un champ obtient une cellule vide, ce qui correspond à la page de convertisseur. Si vous avez besoin d’un flux pour les fichiers énormes, ou d’un renommage de colonnes, ce sont des ajouts à ce script, et non des remplacements.
Façon 6 : les outils que vous avez déjà, VS Code et Excel
Deux autres façons locales ne demandent aucune nouvelle installation si vous utilisez déjà les outils. Dans VS Code, une extension convertit le fichier JSON ouvert en CSV depuis la palette de commandes, ce qui est le chemin local le plus rapide quand vous modifiez déjà le fichier. La visite complète, y compris l’extension et les commandes exactes, est dans le guide VS Code lié ci-dessous. Dans Excel, Power Query lit un fichier JSON depuis votre disque et le transforme en table sans que le fichier quitte jamais la machine : Données, Obtenir des données, Depuis un fichier, Depuis JSON, puis développez les colonnes et chargez. Les deux sont entièrement hors ligne une fois l’outil installé, et les deux gardent le fichier sur votre machine tout du long.
Ces façons échangent du contrôle contre de la commodité. VS Code et Excel décident pour vous du traitement des colonnes, et leurs réglages par défaut sont habituellement corrects pour les données plates et parfois surprenants pour les données imbriquées. Si le résultat semble faux, le diagnostic est le même que partout ailleurs : vérifiez si les valeurs imbriquées ont été aplaties ou laissées sous forme de texte JSON, et vérifiez le délimiteur à l’ouverture. Pour un fichier que vous convertissez une fois, l’une ou l’autre façon vaut mieux que d’installer quelque chose de nouveau. Pour un fichier que vous convertissez chaque semaine, un script que vous possédez vaut mieux que les deux, parce que le script ne dépend ni d’une version d’extension ni d’une boîte de dialogue que vous devez parcourir à nouveau.
Il y a une autre remarque honnête au sujet de la façon 6. Excel et VS Code sont locaux, mais ils ne sont pas minimaux : ce sont de gros programmes avec leurs propres réglages, et un réglage peut changer le résultat, par exemple une locale qui attend des points-virgules au lieu des virgules. Si le résultat diffère entre deux machines, vérifiez les réglages de l’outil avant de blâmer les données. Les scripts n’ont pas ce problème, parce que le script est le réglage.
Côte à côte : quelle façon pour quelle situation
Avec les six façons testées, le choix devient une courte liste de décisions. Fichier unique, rien à installer, confidentialité importante : la page de convertisseur. Fichier plat, vous vivez dans le terminal, vous voulez une seule commande : jq. Fichier plat ou imbriqué, vous utilisez déjà Python, vous pouvez répéter le travail : Python avec pandas. Aucun paquet autorisé, ou un collègue doit aussi le lancer : Python avec la bibliothèque standard plus une fonction d’aplatissement pour les données imbriquées. Conversion dans un projet ou une étape de build : le script Node. Déjà en train de modifier le fichier, ou déjà dans un tableur : VS Code ou Excel.
Deux situations méritent une réponse directe parce qu’elles reviennent constamment. Données sensibles, où le fichier doit rester sur la machine : toute façon de cette page convient, mais un court script que vous lisez vous-même est l’option la plus forte, parce qu’il n’y a rien de caché à qui faire confiance. Lisez le script avant de le lancer sur des données sensibles, gardez le JSON d’origine, et préférez la page ou un script à tout outil qui envoie le fichier. Exports hebdomadaires, où la même forme revient encore et encore : un script, Python avec pandas ou Node, parce que la même commande donne les mêmes colonnes à chaque fois, et que le script peut être planifié.
Et deux situations où aucune façon de cette page n’est la bonne réponse. Plusieurs personnes ont besoin de la même conversion avec les mêmes réglages : une page partagée vaut mieux que cinq copies d’un script qui divergent. Un fichier plus gros que la mémoire : chaque façon ici peine, et la correction consiste à découper le fichier ou à le traiter en flux ligne par ligne, ce qui est un travail différent de la conversion. Nommer ces limites fait partie de la comparaison, et non une lacune de celle-ci.
Ce que chaque façon perd, et pourquoi garder l’original
Chaque façon de cette page perd les mêmes informations, parce que la perte est dans le changement de format, et non dans l’outil. Les types deviennent du texte : un nombre, une valeur vrai/faux, et un nul deviennent tous des caractères dans une cellule, et un tableur peut les réinterpréter à l’ouverture. Les objets imbriqués deviennent des colonnes en notation pointée ou des cellules jointes, et les listes deviennent du texte joint ou des lignes supplémentaires, selon la façon choisie. Il n’y a aucun chemin de retour vers l’arbre d’origine à partir du seul CSV, parce que le CSV n’enregistre pas quelles colonnes étaient imbriquées, quelles cellules étaient des listes, ni quelles valeurs étaient des nombres.
C’est pourquoi la première règle de la conversion locale est de garder le JSON d’origine. Ne convertissez jamais sur place en écrasant la source. Nommez le résultat pour qu’il se trie bien, par exemple orders-2026-10-26.csv, et gardez le JSON à côté. Si le CSV s’avère faux, vous le régénérez à partir du JSON au lieu de déboguer un fichier qui a déjà perdu des informations. Cette règle ne coûte rien et évite le seul échec que vous ne pouvez pas annuler.
La deuxième règle est de compter les lignes. Le CSV doit avoir une ligne d’en-tête plus une ligne par objet du JSON, et un comptage rapide attrape l’échec le plus courant, qui est un détecteur de lignes choisissant la mauvaise liste dans une réponse enveloppée. Si les comptes ne correspondent pas, pointez l’outil vers la liste elle-même, ou déballez d’abord la réponse, avant de faire confiance à une ligne.
Dépannage pour les six façons
Les mêmes quatre problèmes apparaissent dans chaque façon, et chacun a une seule correction. Une ouverture en une seule colonne veut dire un décalage de délimiteur du côté ouverture, et non des données cassées : réimportez et choisissez le délimiteur avec lequel le fichier a été écrit. Des données imbriquées apparaissant sous forme de texte repr ou JSON illisible dans les cellules veulent dire que l’aplatissement a été sauté : le script Python simple et la commande jq en une ligne n’aplatissent pas, donc utilisez la version pandas, le script Node, ou la page avec son interrupteur d’aplatissement activé.
Des colonnes dans un ordre différent de celui du fichier veulent dire qu’un outil a trié les clés : jq a besoin de keys_unsorted, et le script Node préserve l’ordre de première apparition. Des lignes entièrement manquantes veulent dire que le détecteur de lignes a choisi une liste différente de celle que vous vouliez, ce qui arrive avec les réponses d’API enveloppées : la page de convertisseur a une étape de détection de lignes, et un script a besoin que la liste soit passée explicitement. Fichier introuvable veut dire que le terminal est dans un dossier différent de celui du fichier ; vérifiez le chemin avant toute chose. JSON invalide veut dire que le fichier source est cassé près de la position signalée, habituellement un guillemet manquant ou une virgule finale ; validez-le et corrigez la source, parce qu’aucun convertisseur ne doit deviner une entrée cassée.
Guides associés
- convert json to csv locally : convertir JSON en CSV sur votre propre machine, sans rien envoyer (Guide 2026)
- json to csv converter download : ce qu'il faut vraiment télécharger (Guide 2026)
- Comment aplatir JSON en CSV : ce que fait vraiment l’interrupteur (Guide 2026)
- Votre CSV s'ouvre dans une seule colonne dans Excel : pourquoi et comment le corriger (Guide 2026)
- Pourquoi votre CSV affiche des caractères spéciaux illisibles dans Excel, et comment corriger l'encodage (Guide 2026)
- Pourquoi Excel supprime les zéros non significatifs de vos codes CSV, et comment les conserver (Guide 2026)
- Pourquoi Excel change les dates de votre CSV, et comment les conserver (Guide 2026)
- Pourquoi l'enregistrement de votre CSV dans Excel le modifie, et comment protéger l'original (Guide 2026)
- Fichier CSV trop volumineux pour Excel : pourquoi Excel ne l'ouvre pas et que faire à la place (Guide 2026)
Questions fréquentes
Quelles sont les façons de convertir JSON en CSV localement ?
Six façons : une page de convertisseur côté client qui tourne dans votre onglet de navigateur, un script Python qui n’utilise que la bibliothèque standard, Python avec pandas json_normalize, une commande jq en une ligne dans le terminal, un petit script Node avec une fonction d’aplatissement par points, et les outils que vous avez déjà, une extension VS Code ou Excel Power Query. Les six gardent le fichier sur votre propre machine.
Quelle façon locale est la meilleure pour un fichier unique ?
La page de convertisseur. Collez ou envoyez le JSON, convertissez dans l’onglet, téléchargez le CSV, et rien n’est installé. Vous pouvez vérifier qu’elle est locale en vous déconnectant du réseau et en convertissant quand même : cela fonctionne toujours, parce que la conversion tourne dans votre navigateur.
Quelle façon locale traite le mieux le JSON imbriqué ?
Python avec pandas json_normalize, le script Node avec une fonction d’aplatissement par points, ou la page de convertisseur avec son interrupteur d’aplatissement activé. Les trois transforment les objets imbriqués en colonnes en notation pointée comme customer.name. Le script Python simple laisse les valeurs imbriquées sous forme de texte repr, et la commande jq simple en une ligne échoue sur les données imbriquées au lieu de produire une table fausse.
Faut-il installer quelque chose pour convertir JSON en CSV localement ?
Non, si vous utilisez la page de convertisseur ou un outil que vous avez déjà, comme VS Code ou Excel. Python 3 est déjà installé sur la plupart des machines de développeurs et sa bibliothèque standard seule traite les données plates. Pandas, jq, et Node représentent une installation chacun et tous tournent entièrement hors ligne une fois installés.
Pourquoi mon CSV local s’ouvre-t-il en une seule colonne ?
C’est un décalage de délimiteur du côté ouverture, et non des données cassées. Votre tableur a découpé le fichier sur un délimiteur différent de celui avec lequel il a été écrit. Réimportez le fichier et choisissez le délimiteur correspondant, et les colonnes apparaîtront.
Pourquoi les valeurs imbriquées apparaissent-elles sous forme de texte étrange dans mon CSV ?
Parce que l’aplatissement a été sauté. Le script Python simple avec la bibliothèque standard écrit les objets imbriqués sous forme de texte repr Python, et pandas laisse les listes sous forme de texte repr sauf si vous les joignez. Utilisez pandas json_normalize pour les objets plus une jointure pour les listes courtes, ou le script Node, ou la page de convertisseur avec l’aplatissement activé.
La conversion locale perd-elle des informations ?
Oui, les mêmes informations que toute conversion perd. Les valeurs sont préservées mais les types deviennent du texte, les objets imbriqués deviennent des colonnes en notation pointée, et les listes deviennent des cellules jointes ou des lignes supplémentaires. Il n’y a aucun chemin de retour vers l’arbre d’origine à partir du seul CSV, donc gardez toujours le fichier JSON d’origine.
Choisissez votre façon et convertissez maintenant
Commencez par la façon locale la plus rapide : collez n’importe quel JSON dans le convertisseur de cette page et regardez-le se convertir dans votre onglet de navigateur, sans envoi, sans inscription, rien ne quitte votre machine. Ou copiez la version Python, jq, ou Node et lancez-la sur vos propres fichiers.
Ouvrir le convertisseur JSON en CSV