Convertisseur JSON vers CSV et CSV vers JSON
Convertissez du JSON en CSV et du CSV en JSON dans votre navigateur, avec quoting RFC 4180 et inférence de types.
Ce convertisseur JSON vers CSV et CSV vers JSON tourne entièrement dans votre navigateur, donc rien de ce que vous collez ne quitte la page. Collez un tableau JSON d'objets et récupérez un CSV propre avec le quoting RFC 4180 qui va bien, ou collez du CSV du monde réel et récupérez du JSON bien indenté. Le côté CSV est une vraie machine à états qui lit caractère par caractère, pas un split sur les virgules, donc les champs entre guillemets peuvent contenir le delimiter, de vrais retours à la ligne et des guillemets doublés sans décaler vos colonnes. Les objets imbriqués sont aplatis en clés dot-notation comme user.city, les tableaux sont joints avec un pipe, et la détection auto du delimiter plus les options virgule, point-virgule et tabulation gèrent le piège des locales Excel. L'inférence de types optionnelle reconvertit nombres, booléens et null en vrais types JSON tout en refusant de retirer les zéros de tête des codes postaux. Copiez ou téléchargez l'un ou l'autre résultat.
100% dans votre navigateur. Rien de ce que vous tapez ne quitte cette page.
Convertisseur local JSON vers CSV et CSV vers JSON
Deux onglets, deux directions. Collez un tableau JSON d'objets et récupérez un CSV propre avec le quoting RFC 4180 qui va bien, ou collez du CSV du monde réel (oui, avec des virgules et des retours à la ligne à l'intérieur des champs entre guillemets) et récupérez du JSON bien indenté. Tout tourne dans votre navigateur. Rien n'est envoyé nulle part, et c'est exactement ce que je veux quand le fichier est un export du boulot.
Les objets imbriqués sont aplatis en clés dot-notation (user.address.city), les tableaux sont joints avec un pipe. Les champs qui contiennent le delimiter, des guillemets ou des retours à la ligne sont mis entre guillemets et les guillemets internes sont doublés, conformément à la RFC 4180.
Le parseur est une machine à états qui lit caractère par caractère, pas un split sur les virgules. Un champ entre guillemets peut contenir le delimiter, de vrais retours à la ligne et des guillemets doublés. Les erreurs pointent la ligne qui a cassé.
Tout tourne en local. Réfléchissez quand même avant de coller des exports clients dans n'importe quel outil en ligne. Celui-ci garde vos données sur votre machine ; tous ne le font pas.
Pourquoi un simple split sur les virgules s'écroule face au vrai CSV
Le premier convertisseur CSV qu'on écrit tous tient en une ligne : split sur les retours à la ligne, split sur les virgules, terminé. Ça marche à peu près une semaine. Puis quelqu'un exporte un client nommé "Lovelace, Ada" et vos colonnes se décalent d'un cran vers la droite, sur cette ligne uniquement. Bon courage pour repérer ça dans 40 000 lignes.
Le vrai CSV, celui de la RFC 4180, autorise trois choses auxquelles un split naïf ne survit jamais : le delimiter à l'intérieur d'un champ entre guillemets, un retour à la ligne littéral dans un champ entre guillemets, et un guillemet échappé en le doublant. Cette dernière règle veut dire que "She said ""hi""" est un seul et même champ. Une regex ne peut pas suivre si vous êtes à l'intérieur des guillemets ou non ; il faut un état. Alors cet outil parcourt le fichier caractère par caractère, en basculant entre « dans les guillemets » et « hors des guillemets », et ne traite une virgule ou un retour à la ligne comme de la structure que quand il est dehors. Plus long à écrire, ennuyeux à tester. Mais ça vaut le coup.
Honnêtement, je pense que la moitié des plaintes « CSV est un format horrible » qu'on croise sont en réalité des plaintes « mon parseur était un appel à split() ». Le format va très bien. Vieillot, mais il va bien.
Aplatir du JSON imbriqué : les compromis, sans enrobage
Un tableur est plat. Votre JSON, probablement pas. Quelque chose doit céder, et voilà comment cet outil tranche : les objets imbriqués deviennent des clés dot-notation, donc un objet user contenant une city de Lyon se transforme en une colonne nommée user.city. Les tableaux sont joints dans une seule cellule avec un pipe. Si un tableau contient des objets, chaque objet est sérialisé en JSON avant la jointure, ce qui est moche dans Excel mais au moins rien ne se perd en silence.
Est-ce que c'est lossy ? Oui, un peu. Convertissez dans l'autre sens et vous obtiendrez des objets plats avec des clés à points, pas l'imbrication d'origine. La jointure au pipe suppose aussi que vos valeurs ne contiennent pas elles-mêmes de pipes ; si c'est le cas, choisissez une autre approche (ou gardez ces données en JSON, là où elles sont à leur place). Je préfère vous le dire d'entrée plutôt que de prétendre que la conversion est réversible dans tous les cas. Les données plates font l'aller-retour parfaitement. Les données imbriquées reviennent aplaties.
Le problème du point-virgule dans Excel, celui dont personne ne vous parle
Vous exportez un fichier séparé par des virgules parfaitement valide, vous l'envoyez à un collègue à Paris ou Berlin, et il l'ouvre pour découvrir chaque ligne entassée dans la colonne A. Le fichier n'a rien. Excel lit simplement les réglages régionaux de Windows, et dans les locales où le séparateur décimal est la virgule (la majeure partie de l'Europe continentale), il attend des points-virgules entre les champs.
C'est toute la raison d'être de l'option point-virgule dans cet outil. Vous bossez avec des utilisateurs d'Excel en locale française ? Exportez avec des points-virgules et le fichier s'ouvre nickel, sans assistant d'import. L'option tab est la troisième porte de sortie : les tabulations n'apparaissent presque jamais dans les données, donc le TSV esquive presque entièrement la valse des guillemets. Moins élégant, étonnamment fiable.
L'inférence de types : utile et un peu dangereuse
Le CSV n'a pas de types. Tout est texte. Alors au retour vers JSON, cet outil peut deviner si vous le lui demandez : 36 devient un nombre, true devient un booléen, une cellule vide devient null. La plupart du temps, c'est exactement ce que vous voulez, et c'est ce qui permet à un aller-retour plat de revenir identique.
Mais deviner, ça mord. Un code postal comme 00042 ne doit surtout pas devenir 42, donc l'inférence refuse ici tout ce qui commence par un zéro. Les entiers de plus de 15 chiffres restent des chaînes eux aussi, parce que les nombres JavaScript les arrondiraient en silence (demandez à n'importe qui ayant fait passer des IDs Twitter dans JSON.parse). Et il n'y a pas de remède à l'ambiguïté : si une cellule contient littéralement le texte true, l'outil ne peut pas savoir si vous vouliez un booléen ou un mot. Quand les données sont des IDs, des numéros de téléphone ou des codes, coupez l'inférence et castez les types vous-même en aval. Quand ce sont des mesures et des flags, laissez-la activée et profitez.
Questions fréquentes
Est-ce que l'outil gère les virgules et les retours à la ligne dans les champs ?
Oui. Le parseur est une vraie machine à états qui lit le fichier caractère par caractère, donc un champ entre guillemets peut contenir le delimiter, de vrais retours à la ligne, des guillemets doublés, même une virgule finale. C'est la raison d'être de cet outil. Un split sur les virgules ne sait rien faire de tout ça.
Pourquoi Excel ouvre mon CSV dans une seule colonne géante ?
La locale, presque à chaque fois. Si la région de la machine utilise la virgule comme séparateur décimal, Excel attend des points-virgules entre les champs et traite vos virgules comme du texte ordinaire. Ré-exportez ici avec le delimiter point-virgule et le fichier s'ouvre proprement. Ou passez par l'assistant d'import d'Excel et choisissez le delimiter à la main.
Que deviennent les objets imbriqués et les tableaux ?
Les objets imbriqués deviennent des clés dot-notation, donc user.address.city se transforme en une seule colonne. Les tableaux sont joints avec un pipe. C'est lossy par conception : un tableur est plat et votre JSON ne l'est pas. Pour les tableaux d'objets, chaque élément est sérialisé avant la jointure, ce qui est moche mais honnête.
Mes codes postaux vont-ils perdre leurs zéros de tête ?
Pas ici. L'inférence de types refuse délibérément de convertir tout ce qui commence par un zéro, donc 00042 reste une chaîne. C'est Excel qui massacre ces valeurs, en général dès l'ouverture du fichier. Les entiers de plus de 15 chiffres restent des chaînes eux aussi, parce que JavaScript les arrondirait en silence.
Mes données sont-elles envoyées quelque part ?
Non. Toute la conversion tourne dans votre navigateur ; vous pourriez passer hors ligne, ça marcherait encore. Cela dit, ne prenez pas l'habitude de coller des données clients dans des outils en ligne au hasard. Celui-ci garde tout en local, mais c'est l'habitude qui est risquée.
Puis-je reconvertir le CSV vers exactement le même JSON ?
Si le JSON était plat, oui. Avec l'inférence de types activée, l'aller-retour revient identique, quoting compris. S'il contenait des objets imbriqués, le côté CSV ne connaît que les clés dot-notation, donc vous récupérez des objets plats nommés user.city au lieu de l'imbrication d'origine. Les valeurs, elles, survivent intactes.