Outils de développement · Formateur et validateur JSON
Comment un validateur JSON trouve la ligne et la colonne exactes d'une erreur
· Comment ça marche
json validation workflow de développeur
Les moteurs de navigateur signalent les échecs JSON.parse différemment, et certains ne donnent qu'un décalage de caractères. Cet article explique comment un validateur transforme cela en ligne et en colonne, et pourquoi la position marque l'endroit où l'analyse s'est arrêtée plutôt que l'endroit où vous avez commis l'erreur.
Le message d'erreur qui ne vous dit rien : pourquoi « Jeton inattendu dans JSON à la position 1432 » est inutile dans un fichier de 400 lignes
Une erreur telle que « Jeton inattendu » est frustrante dans une configuration longue car elle ne propose aucun emplacement que vous pouvez ouvrir dans votre éditeur. JSON.parse est l'analyseur faisant autorité du navigateur, mais son texte de diagnostic diffère selon les moteurs et les versions JavaScript. ToolAcre ne devine pas l'emplacement en faisant correspondre une chaîne d'erreur anglaise instable. Si JSON.parse échoue, un scanner strict distinct parcourt le texte original pour identifier le premier caractère que la grammaire JSON ne peut pas accepter.
Ce que fait réellement un analyseur JSON pendant qu'il lit : une visite guidée de la tokenisation et de la grammaire de descente récursive qui consomme une valeur à la fois.
JSON comporte six caractères structurels (accolades, crochets, deux-points et virgules) et des valeurs qui peuvent être des chaînes, des nombres, des tableaux, des objets, vrais, faux ou nuls. Un scanner doit savoir si elle se trouve à l'intérieur d'une chaîne entre guillemets avant d'appeler une virgule comme séparateur : {"note": "A,B"} a une valeur, pas deux. Il parcourt une valeur ou un membre d’objet et vérifie ce qui peut légalement suivre ensuite. La RFC 8259 définit cette grammaire et, contrairement aux littéraux d'objet JavaScript, elle n'autorise pas les commentaires ni les virgules de fin.
Du décalage de caractères à la ligne et à la colonne - compter les nouvelles lignes jusqu'au décalage d'échec et pourquoi les terminaisons CRLF et les caractères multi-octets compliquent le décompte
Un scanner commence généralement par un décalage de base zéro dans la chaîne JavaScript d'origine. Pour rendre cela utile, comptez les sauts de ligne avant le décalage et déterminez à quelle distance se situe l'échec par rapport au dernier saut. CRLF doit être traité comme une fin de ligne visuelle, et non comme deux lignes ; les positions dans les chaînes JavaScript comptent les unités de code UTF-16, et non UTF-8 bytes sur le disque. Un emoji non BMP peut occuper deux unités de code dans un éditeur qui affiche visuellement un glyphe. L'interface utilisateur affiche une ligne, une colonne et un extrait afin que vous puissiez comparer le curseur avec le fichier que vous avez collé.
L'erreur n'est pas l'endroit où l'analyse s'arrête : une virgule manquante est signalée à la clé suivante, et une citation parasite peut faire descendre l'erreur de plusieurs lignes.
Le premier jeton impossible se situe souvent après l’erreur initiale. Dans un objet, oublier une virgule après true rend illégale la citation commençant la propriété suivante : l'analyseur attendait une virgule ou une accolade fermante. Une chaîne non terminée peut provoquer l'apparition de l'erreur à un saut de ligne ultérieur ou à la fin de la saisie. Lisez à rebours à partir du point signalé pour trouver le délimiteur manquant ; ne présumez pas que le caractère sous le curseur doit être supprimé.
Exemple concret : une configuration avec une virgule manquante – la position signalée, les jetons environnants et comment revenir en arrière jusqu'à la cause réelle
Essayez le document littéral de trois lignes {"name": "demo", suivi de "enabled": true sur la deuxième ligne et "port": 8080} sur la troisième ligne, sans virgule après true. ToolAcre signale la ligne 3, colonne 1, décalage 31 : il s'attend à une virgule ou } après la propriété précédente et affiche un signe d'insertion sous la première citation de "port". Insérez une virgule à la fin de la deuxième ligne, puis validez à nouveau. Il s’agit d’un diagnostic du premier obstacle syntaxique, et non d’un jugement selon lequel le mot « port » est erroné.
En quoi les moteurs de navigateur diffèrent : V8, SpiderMonkey et JavaScriptCore formulent différemment le même échec, c'est pourquoi un rapport cohérent par ligne et colonne est utile
V8, SpiderMonkey et JavaScriptCore ont utilisé des formulations différentes et parfois des extraits contextuels différents pour le même échec JSON.parse. Le scanner de ToolAcre fournit sa propre raison structurelle et son propre emplacement lorsque l'analyseur natif rejette la valeur. Si le scanner n'est pas d'accord avec JSON.parse, l'outil renvoie l'erreur du moteur plutôt que de fabriquer une position. Cette solution de repli est plus sûre que de pointer avec confiance vers un personnage deviné.
Ce que cela ne couvre pas : les problèmes sémantiques tels que les types incorrects, les champs manquants ou les violations de schéma, qu'un validateur de syntaxe ne signalera jamais.
Un objet syntaxiquement valide peut toujours être erroné pour votre application : un champ obligatoire manquant, un âge écrit sous forme de texte, deux clés en double ou une référence à un fichier inexistant ne sont pas automatiquement des JSON invalides. La RFC 8259 indique que les noms de membres doivent être uniques pour l'interopérabilité, mais une simple analyse n'applique pas votre schéma API. Validez la syntaxe ici et validez les contraintes sémantiques dans le programme qui consomme le document.
À retenir : lisez la position comme "le premier jeton que la grammaire ne pouvait pas accepter" - et comment le formateur et validateur JSON signale cette ligne et cette colonne sans télécharger le texte
Traitez la position signalée comme « le premier jeton que cette grammaire ne pouvait pas accepter ». Revenez en arrière jusqu'à la cause, corrigez un problème et réexécutez. Le formateur et validateur JSON le fait localement sans télécharger une configuration collée. Ne collez pas les véritables informations d'identification de production sur un site Web public si un éditeur hors ligne peut diagnostiquer le fichier à la place.