Outils de développement · JSON formateur et validateur
Littéraux d'objet JavaScript vs JSON : pourquoi les guillemets simples échouent à la validation
· Comment ça marche
json flux de travail du développeur validation
Un objet imprimé par une console JavaScript ressemble à JSON mais ne l'est généralement pas. Cet article répertorie les différences exactes (guillemets, clés non citées, non définies, fonctions) et montre où chacune déclenche un validateur.
Il est sorti de la console, alors pourquoi n'est-il pas valide ?
Il est sorti de la console, alors pourquoi n'est-il pas valide ? — les consoles de développement affichent les valeurs JavaScript sous forme de texte de type source JavaScript, et non sous la forme d'une sérialisation JSON garantie. Un objet copié peut contenir des noms de propriété nus, des chaînes entre guillemets simples, `undefined` ou des annotations spécifiques au navigateur. Tous ces éléments peuvent être compréhensibles par un moteur JavaScript ou un lecteur humain tout en échouant immédiatement dans un fichier `.json`, dont la grammaire est intentionnellement plus petite et indépendante du code exécutable.
Considérez `{name: "Ada", active: true, missing: undefined}`. Les accolades, les deux points et les booléens ressemblent à JSON, mais la première clé nue viole déjà la règle des membres d'objet, et `undefined` échouerait plus tard. ToolAcre signale le premier caractère ou valeur non pris en charge avec une ligne et une colonne, il est donc préférable d'effectuer la conversion dans l'ordre.
Les chaînes doivent utiliser des guillemets doubles
Les chaînes doivent utiliser des guillemets doubles — JSON définit une chaîne sous forme de caractères entourés par `"`, avec des barres obliques inverses si nécessaire. Un guillemet simple n'a aucun rôle de délimiteur de chaîne. Lorsqu'un validateur rencontre `'Ada'`, il ne commence pas une chaîne puis ne s'oppose pas à son contenu ; il rejette lui-même l’apostrophe d’ouverture. Cela s'applique également aux noms de propriété et aux valeurs de chaîne, même si JavaScript autorise l'un ou l'autre style de guillemets pour ses propres littéraux.
La conversion des guillemets nécessite plus de soin que le remplacement global de chaque apostrophe. Une apostrophe à l'intérieur d'un texte tel que `Ada's profile` est un contenu ordinaire une fois que la valeur est entre guillemets doubles, tandis que les guillemets doubles existants à l'intérieur de ce contenu doivent être échappés. Le formulaire JSON valide est `"Ada's "profile""`.
Les clés doivent être des chaînes entre guillemets
Les clés doivent être des chaînes entre guillemets — Les littéraux d'objet JavaScript autorisent les noms de style identifiant tels que `{name: 1}` et les noms calculés tels que `{[expression]: 1}`. JSON n'autorise aucun des deux raccourcis. Après une accolade ouvrante ou une virgule, le membre suivant doit commencer par une chaîne entre guillemets doubles, suivie de deux points. La représentation valide est `{"name": 1}`. Un validateur qui pointe vers le `n` identifie l'endroit exact où un devis était requis.
Citer chaque clé supprime également toute ambiguïté autour des espaces, des traits d'union et des mots réservés. JavaScript peut nécessiter une syntaxe source différente dans ces cas, mais JSON utilise une règle cohérente : `"display-name"`, `"first name"` et `"default"` sont tous des noms de membres ordinaires. Les touches d'apparence numérique sont également des chaînes.
Les valeurs JSON n'ont tout simplement pas
Valeurs JSON n'a tout simplement pas — son vocabulaire de valeurs est objet, tableau, chaîne, nombre, `true`, `false` et `null`. Il n'y a pas de `undefined`, `NaN`, `Infinity`, de fonction, d'expression régulière, de littéral BigInt ou Date. Les commentaires sont absents de la grammaire et les nombres ne peuvent pas utiliser de signes plus hexadécimaux, binaires, de début ou de séparateurs numériques JavaScript. Chaque construction empruntée atteint finalement un personnage qui ne peut pas commencer ou continuer une valeur JSON valide.
La conversion nécessite une décision concernant les données plutôt qu'une astuce orthographique. Remplacez `undefined` par `null` uniquement si une valeur vide explicite correspond au contrat d'application ; sinon, supprimez le membre ou fournissez une valeur réelle. Encodez les dates sous forme de chaînes convenues, souvent ISO 8601. Représentez des nombres non finis selon l'API de réception au lieu d'inventer un jeton JSON.
Exemple pratique : conversion d'un dump de console en JSON valide
Exemple pratique : conversion d'un dump de console en JSON valide — commencez par `{name: 'Ada', active: true, score: NaN, updated: new Date()}`. Citez `name`, `active`, `score` et `updated` avec des guillemets doubles. Remplacez la valeur du nom par une chaîne entre guillemets doubles. Décidez qu'un score indisponible doit être `null` et remplacez l'expression du constructeur par la chaîne d'horodatage réelle qu'elle était censée produire. Le document ne contient désormais que les membres et valeurs JSON.
La forme finie pourrait être `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`. Validez après chaque catégorie de réparation car la première erreur peut masquer la syntaxe ultérieure uniquement JavaScript. Le formatage du résultat accepté expose ensuite sa structure sans effectuer de conversion supplémentaire.
Le piège inverse — JSON valide que JavaScript lirait différemment, comme les très grands entiers et la clé __proto__
Le piège inverse - JSON valide peut toujours acquérir un comportement ou des limitations spécifiques à JavaScript après l'analyse. Les nombres JSON n'ont pas de limite de précision intégrée dans la grammaire, mais JSON.parse produit des valeurs numériques JavaScript. Un nombre entier au-delà de la plage de sécurité peut donc être arrondi silencieusement. Si chaque chiffre compte, codez l'identifiant sous forme de chaîne ou utilisez un analyseur et un type de données conçus pour préserver les nombres à précision arbitraire plutôt que de vous fier à une vérification de syntaxe réussie.
Le nom de membre `"__proto__"` est également valide JSON et JSON.parse le crée en tant que propre propriété de données. Les problèmes peuvent commencer plus tard si le code de l'application copie les propriétés analysées dans un autre objet avec un comportement d'affectation ou de fusion non sécurisé. La validation prouve que le texte suit la grammaire JSON ; cela ne prouve pas que chaque clé est sûre pour chaque consommateur.
Ce que cela ne couvre pas
Ce que cela ne couvre pas : JSON5, JSONC et les langages de configuration qui acceptent délibérément les commentaires, les virgules finales, les noms sans guillemets ou les chaînes entre guillemets simples. Ces formats résolvent différents problèmes de création et nécessitent des analyseurs qui implémentent leurs propres grammaires. Un validateur JSON strict ne devrait pas les réinterpréter silencieusement, car accepter une syntaxe supplémentaire rendrait son résultat trompeur pour les API, les métadonnées de package et d'autres destinations qui nécessitent réellement la norme JSON.
Cette distinction exclut également l'évaluation arbitraire de JavaScript. L'exécution de texte collé via `eval` ou un constructeur de fonction simplement pour transformer un objet littéral en données peut exécuter des getters, des appels ou d'autres expressions hostiles. Si la source est du JavaScript de confiance sous votre contrôle, sérialisez la valeur réelle avec JSON.stringify. Si la source est un texte non fiable, ne l'exécutez pas.
À retenir : un littéral est un code, JSON est une donnée
À retenir : un littéral est un code, JSON est une donnée – la similarité visuelle ne rend pas leurs grammaires interchangeables. JSON nécessite des chaînes et des noms de membres entre guillemets, n'autorise qu'un petit ensemble fixe de types de valeur et ne contient aucun commentaire ni expression exécutable. Un diagnostic de ligne et de colonne marque le premier endroit où la source copiée quitte cette grammaire. Réparer ce point et valider à nouveau est plus fiable que d'appliquer une recherche et un remplacement étendus à un vidage de console.
Lorsque vous contrôlez la valeur JavaScript, générez JSON avec JSON.stringify au lieu de copier sa représentation de console. Lorsque vous recevez du texte, analysez-le uniquement avec l'analyseur de son format déclaré et ne l'exécutez jamais comme raccourci. Une validation JSON réussie établit la syntaxe, et non la précision numérique, la conformité au schéma ou la gestion sécurisée des propriétés en aval.