Lire du CSV est plus difficile qu'il n'y paraît, et toutes les difficultés d'une conversion CSV vers JSON viennent du côté CSV. JSON a une spécification et un sens. Le CSV a une convention souple et beaucoup de variantes locales, donc le premier travail est de déterminer ce qu'est réellement le fichier devant vous.
Les délimiteurs sont la première question. La virgule donne son nom au format et le point-virgule est très répandu dans les exports européens, parce qu'une locale qui utilise la virgule comme séparateur décimal ne peut pas s'en servir aussi pour séparer les champs. Les fichiers séparés par tabulations sont courants en traitement de données. Un convertisseur qui devine tombera le plus souvent juste, et il vaut la peine de pouvoir le corriger quand ce n'est pas le cas, ce qui se voit immédiatement : chaque ligne arrive comme un champ unique.
C'est dans les guillemets que réside la justesse. Un champ contenant le délimiteur doit être entre guillemets, et un champ entre guillemets peut contenir le délimiteur, des retours à la ligne et des guillemets échappés. Voilà pourquoi découper un CSV sur les virgules est faux pour tout fichier contenant une adresse ou un commentaire libre : le découpage naïf casse en plein champ et toutes les colonnes suivantes se décalent. Un vrai analyseur suit l'état des guillemets, et c'est la différence entre une conversion qui marche sur votre échantillon et une qui marche sur le fichier.
La ligne d'en-tête détermine vos clés JSON, donc sa qualité est celle de la sortie. Noms de colonnes en double, cellules d'en-tête vides, noms avec des espaces au début ou à la fin : tout cela produit des clés qu'il faudra ensuite contourner dans le code. Mieux vaut corriger l'en-tête avant la conversion qu'après.
Les types sont la décision qui change le plus le résultat. Tout est du texte dans un CSV, donc le convertisseur doit décider si « 123 » devient le nombre 123 ou reste une chaîne, et si « true » devient un booléen. Inférer les types est commode et c'est ainsi que les identifiants perdent leur zéro initial, que les codes postaux deviennent des entiers, et qu'une colonne majoritairement numérique mais contenant parfois un tiret arrive avec des types mélangés. Tout garder en chaînes ne perd rien et vous rend la décision, ce qui pour des identifiants est en général le bon endroit.
L'encodage est le dernier piège. Un CSV exporté d'un tableur peut être en UTF-8, en UTF-8 avec marque d'ordre des octets, ou dans un encodage régional ancien, et le symptôme d'une erreur est que les caractères accentués arrivent en paires de symboles sans rapport. Si les noms paraissent abîmés, le problème était l'encodage et non la conversion.
Tout cela se passe dans votre navigateur. Le fichier est lu localement, analysé localement, et le JSON est produit localement, ce qui compte car un CSV est très souvent une liste de clients, un export de commandes ou un extrait de paie.