Outils de développement · JSON formateur et validateur
Toute la grammaire JSON sur une seule page : six types de valeurs, deux conteneurs Conversion de
· Contexte
json normes validation
JSON tient sur une seule page, et la connaître par cœur rend chaque erreur du validateur évidente. Cet article passe en revue les six types de valeurs, les deux conteneurs et la poignée de règles qui font trébucher les gens.
Chaque erreur que vous avez vue provient d'une seule page.
Chaque erreur de syntaxe est une attente brisée dans une grammaire compacte. Après l'ouverture d'un objet, un analyseur attend un nom de membre entre guillemets ou une accolade fermante ; après un nom, il attend deux points ; après une valeur, il attend une virgule ou la fin du conteneur. Il est plus utile de lire une erreur comme une transition ratée que de traiter le caractère signalé comme mystérieux.
ToolAcre accepte les valeurs et les espaces standard JSON, puis applique deux limites de saisie pratiques. Le texte de plus de 8,000,000 caractères est rejeté avant l'analyse, et l'imbrication du scanner au-delà des conteneurs 512 est rejetée plutôt que parcourue indéfiniment. Il s'agit de limites de produits, pas de nouveaux types JSON. En leur sein, le diagnostic identifie le premier point où le flux de jetons ne peut plus satisfaire la grammaire.
Les six valeurs : objet, tableau, chaîne, nombre, true/false et null, et le fait qu'il n'y a rien d'autre
Une valeur JSON est un objet, un tableau, une chaîne, un nombre, un booléen ou une valeur nulle. Les objets et les tableaux peuvent contenir n'importe lequel des six conteneurs, y compris davantage de conteneurs. Les orthographes littérales sont exactement `true`, `false` et `null` ; la capitalisation n’est pas flexible. Les jetons tels que `True`, `None`, `undefined`, `NaN` et `Infinity` sont en dehors du strict JSON même lorsqu'une autre langue en reconnaît certains.
Cette courte liste fait de la classification une technique de débogage utile. Dans `{"reading": NaN}`, les deux points introduisent correctement une valeur, mais `N` ne peut commencer aucune valeur autorisée. Remplacez-le uniquement après avoir décidé de la signification des données, peut-être `null` ou un statut cité. Un outil de syntaxe peut rejeter le jeton ; il ne peut pas choisir le substitut de l’application ni décider si le champ y appartient.
Objets et tableaux - membres séparés par des virgules, les deux-points et pourquoi la RFC 8259 laisse l'ordre et les noms en double aux implémentations Les objets
contiennent des membres name/value séparés par des virgules. Chaque nom est une chaîne entre guillemets suivie de deux points et d'une valeur. Les tableaux contiennent des valeurs séparées par des virgules, sans noms ni deux-points. Les conteneurs `{}` et `[]` vides sont valides, mais une virgule ne peut pas commencer, suivre ou apparaître deux fois. Faire correspondre chaque délimiteur à son conteneur expose rapidement de nombreux échecs apparents de type « jeton inattendu ».
Les noms d'objet sont censés être uniques, mais les orthographes en double ne sont pas rejetées par ce validateur. `{"port": 80, "port": 443}` analyse et `JSON.parse` conserve la dernière valeur. Le formatage émet alors uniquement ce membre survivant, de sorte que le texte antérieur ne peut pas être récupéré à partir du résultat. Les positions du tableau se comportent différemment : chaque élément reste présent et son ordre fait partie de la valeur.
Chaînes et nombres avec précision
Les chaînes utilisent des guillemets doubles. Une barre oblique inverse peut introduire une guillemet, une barre oblique inverse, une barre oblique, `b`, `f`, `n`, `r`, `t` ou un échappement Unicode à quatre chiffres ; les caractères de contrôle bruts sont interdits. Les guillemets simples sont des jetons invalides ordinaires en dehors d'une chaîne. Ces règles expliquent pourquoi les littéraux JavaScript copiés et le texte multiligne collé peuvent paraître lisibles tout en échouant à la validation stricte JSON.
Un nombre peut avoir un signe moins, une partie entière, une fraction facultative et un exposant facultatif. Il ne peut pas commencer par `+`, utiliser la notation hexadécimale, porter un zéro non significatif avant un autre chiffre ou épeler une valeur non finie. `-0.25e+2` est valide ; `01`, `.5`, `2.` et `Infinity` ne le sont pas. L'analyse vérifie la grammaire, et non si JavaScript peut conserver exactement chaque chiffre.
Espaces et niveau supérieur
En dehors des chaînes, les espaces JSON sont limités à l'espace, à la tabulation horizontale, au saut de ligne et au retour chariot. Un espace insécable copié à partir d'une page Web n'est pas interchangeable avec un espace ordinaire. Le formatage peut librement choisir parmi les espaces autorisés autour des jetons, mais il doit conserver les espaces qui appartiennent à une chaîne entre guillemets, car ces caractères sont des données.
Le document complet peut être n'importe quelle valeur JSON unique, pas seulement un objet ou un tableau. `42`, `false` et `"ready"` sont des textes de niveau supérieur valides. Ce qui est interdit, c'est une deuxième valeur après la première : `42 43` représente deux documents, pas un. Cette distinction explique pourquoi JSON délimité par une nouvelle ligne nécessite une gestion enregistrement par enregistrement plutôt qu'une analyse ordinaire du fichier entier.
Exemple concret : analyser un petit document à la main
Prenez `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. L'objet racine commence un membre nommé `order` ; sa valeur est un tableau contenant un nombre, null et un autre objet. Une virgule introduit ensuite `note`, dont la valeur est une chaîne avec une nouvelle ligne échappée. Chaque deux points, virgule et délimiteur fermant a un rôle grammatical.
Supprimez maintenant la citation avant `paid`. Après l'accolade imbriquée, l'analyseur attend une accolade fermante ou un nom cité, il échoue donc à `p`. Vous pouvez également ajouter une virgule après `true` ; l'analyseur accepte la virgule puis échoue à `}` car un autre membre doit suivre. La prédiction manuelle de ces positions transforme la validation en confirmation et décourage les modifications aléatoires de ponctuation.
Ce que cela ne couvre pas
La grammaire n'a pas de type date, décimal-argent, binaire, UUID ou durée. Les applications représentent généralement ces concepts avec des chaînes ou des nombres et imposent des conventions séparément. Un horodatage peut être une chaîne JSON parfaitement valide tout en contenant une date impossible. De même, un objet syntaxiquement valide peut omettre les propriétés requises ou utiliser les mauvaises unités sans violer une seule règle d'analyse.
ToolAcre n'effectue pas de vérifications de schéma, de validation de domaine ou de canonisation. Il ne réinterprète pas non plus les fonctionnalités JSON5 ou JSONC telles que les commentaires et les virgules de fin. Son travail est plus restreint : accepter un texte JSON strict dans les limites du produit, formater la valeur analysée et identifier les échecs de syntaxe. Conservez les questions ultérieures sur la forme et la signification dans la couche de validation de l’application consommatrice.
À retenir : mémorisez la grammaire, faites confiance à la position
La liste de contrôle durable est courte : six catégories de valeurs, noms d'objets entre guillemets, virgules uniquement entre les éléments, deux-points uniquement entre les noms et les valeurs, échappements de chaîne stricts, orthographe stricte des nombres, quatre caractères d'espacement et exactement une valeur de niveau supérieur. Lorsqu'un document échoue, identifiez ce que la grammaire permettait juste avant la position rapportée et comparez cette attente avec le caractère réellement présent.
Faites confiance à la position comme premier point impossible, pas toujours au caractère qui doit être supprimé. Une accolade fermante peut être mise en surbrillance parce qu'une virgule précédente promettait un autre membre ; une lettre innocente peut être mise en évidence parce que sa citation d'ouverture est manquante. Réparez la cause, réexécutez la validation et répétez. Pour une saisie surdimensionnée ou extrêmement approfondie, abordez la limite du produit de 8 millions de caractères ou de 512 profondeur avant que les diagnostics de syntaxe puissent vous aider.